Дублирование идентификаторов в Local Collection при изменении подписки Meteor

Вот мой сценарий:

У меня есть коллекция событий календаря. К некоторым событиям привязано правило повторения. Когда я подписываюсь на события в клиенте, я создаю новую локальную коллекцию с именем LocalEvents. Я перебираю все свои события, опубликованные из коллекции Events, и вставляю новый документ в свою локальную коллекцию для каждого появления моего события.

Вот мой код с комментариями

//create reactive variable
const searchQuery = new ReactiveVar(null);

export default createContainer(({ params }) => {
    //subscribe to subscription passing the reactive var as the variable
    const subscription = Meteor.subscribe('Events.publications.admin.list.all', searchQuery.get());
    const loading = !subscription.ready();
    const allEvents = Events.find();

    //loop through cursor, if event recurs - create new document for the event and insert it in to LocalEvents collection
    allEvents.forEach(function(event) {
        if (event.eventRecurs) {
            //grab array of all recurring dates
            const dates = event.recurringDates;
            //loop through recurring dates and create new event document for each with a random ID and a parentId of the original event
            _.each(dates, (date) => {
                LocalEvents.insert({
                    '_id': Random.id(),
                    'name': event.name,
                    'description': event.description,
                    'defaultDate': date,
                    'parentId': event._id
                });
            })

        } else {
            //if event doesn't recur, set parentId and insert into local collection
            event.parentId = event._id;
            LocalEvents.insert(event);
        }
    });

    const events = LocalEvents.find({}, { sort: { defaultDate: 1 }}).fetch();
    //pass everything to the component
    return { loading, events, searchQuery };
}, AdminEventsAll);

Моя проблема заключается в том, что когда моя подписка изменяется (с помощью панели поиска), кажется, что локальная коллекция все еще содержит некоторые документы, поскольку в ней повторяются экземпляры событий. Аргумент, который я передаю своей подписке (searchQuery), устанавливается каждый раз, когда нажимается клавиша в строке поиска в моем пользовательском интерфейсе — это создает реактивный поиск. Когда я печатаю, для каждой буквы, которую я печатаю, я вижу дубликаты документов. В основном это показывает, что локальная коллекция пополняется одними и теми же документами, поэтому они повторяются снова и снова.

Как я могу убедиться, что коллекция правильно очищается в моем контейнере каждый раз, когда изменяется поисковый запрос?

заранее спасибо

** РЕДАКТИРОВАТЬ - НАЙДЕНО РЕШЕНИЕ **

Я добавил решение, которое нашел в качестве ответа


person Sean    schedule 15.02.2017    source источник


Ответы (1)


Для всех, у кого есть аналогичная проблема, мне удалось найти решение.

я добавил

Tracker.autorun(function(allEvents) {
    LocalEvents.remove({});
});

Теперь каждый раз, когда курсор из подписки изменяется (например, когда пользователь ищет и изменяет реактивную переменную searchQuery), функция Tracker очистит локальную коллекцию, а затем она будет повторно заполнена.

person Sean    schedule 15.02.2017