Фильтры Meteor + React в подписках - PullRequest
0 голосов
/ 05 ноября 2018

Я использую метеор и реагирую с 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 раза меняет одно поле, запрос работает только в первый раз. Вот почему я должен это сделать, но я не понимаю, почему ...

Это не оптимизированное решение, и, возможно, у кого-то есть другая идея или, по крайней мере, можно объяснить, почему я должен сделать это, чтобы оно работало?

Спасибо!

...