Я использую метеор и реагирую с withTracker для получения динамических данных. У меня есть большой объем данных, и я должен фильтровать данные на стороне сервера, в противном случае, сбой клиента. Для этого я использую фильтры в качестве параметров публикаций.
Проблема в том, что компонент не обновляется при изменении одного поля запроса, которое уже находится в прошлом запросе. Чтобы решить эту проблему, я добавляю или удаляю {"_id": {$ exist: true}}, чтобы компонент обновлялся и не использовал данные кэша.
Публикация на стороне сервера:
Meteor.publish('subredOrders', function(filters={}, sort={"_id":1}, pagination={skip:0,limit:2000}, fields={}) {
return SubredOrders.find(filters, {sort: sort, skip: pagination.skip, limit: pagination.limit, fields: fields});
});
Meteor.publish('subredOrders.count', function(filters={}) {
Counts.publish(this, 'subredOrders.count', SubredOrders.find(filters), {fastCount: true});
});
Клиентский компонент:
class MyTable extends Component {
constructor(props) {
super(props);
this.state = {
filtersPanel: false,
};
this.temp = {filters: this.props.params.filters};
}
toggleFiltersPanel(){
let filtersPanel = this.state.filtersPanel;
filtersPanel = !filtersPanel;
*if (!filtersPanel) {
if (this.temp.filters["$and"] && this.temp.filters["$and"].length > 0) {
let removed = false;
for(let i=0; i < this.temp.filters["$and"].length; i++){
for(let key in this.temp.filters["$and"][i]) {
if (key === "_id") {
this.temp.filters["$and"].splice(i, 1);
removed = true;
}
}
}
if (!removed) this.temp.filters["$and"].push({"_id":{$exists:true}});
}
this.props.updateParams("filters", this.temp.filters);
}*
this.setState({filtersPanel: filtersPanel});
}
...
render() {
...
}
}
export default withTracker((props) => {
if (props.collector == null) return {};
let sub = Meteor.subscribe(props.subscription, props.params.filters, props.params.sort, props.params.pagination);
let countSub = Meteor.subscribe(props.subscription+".count", props.params.filters);
return {
collection: props.collector.find({}, {limit: props.params.pagination.limit}).fetch(),
dataLoaded: sub.ready() && countSub.ready(),
}
})(MyTable);
Мое решение между 2 *. Когда пользователь закрывает filtersPanel, он запускает toggleFiltersPanel и проверяет, есть ли в части запроса фильтра _id или нет, и нажимает или удаляет, чтобы сделать его отличным от предыдущего. Если пользователь 2 раза меняет одно поле, запрос работает только в первый раз. Вот почему я должен это сделать, но я не понимаю, почему ...
Это не оптимизированное решение, и, возможно, у кого-то есть другая идея или, по крайней мере, можно объяснить, почему я должен сделать это, чтобы оно работало?
Спасибо!