Meteor订阅更改时,Local Collection中的ID重复

时间:2017-02-15 15:20:36

标签: meteor minimongo

这是我的情景:

我有一系列日历活动。某些事件附加了重复规则。当我订阅客户端中的事件时,我创建了一个名为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);

我的问题是,当我的订阅发生变化时(通过使用搜索栏) - 似乎本地集合仍然包含一些文档,因为事件的重复实例。每次在我的UI中的搜索栏中按下某个键时,我都会设置我传递给我的订阅(searchQuery)的参数 - 这会创建一个被动搜索。当我输入时,对于我输入的每个字母,我看到文件重复。它基本上表明本地集合正在重新填充相同的文档,因此它们会一遍又一遍地重复。

每次searchQuery更改时,如何确保集合在我的容器中正确清空?

提前致谢

**编辑 - 找到解决方案**

我添加了我找到的解决方案

1 个答案:

答案 0 :(得分:0)

对于遇到类似问题的其他人,我设法找到了解决方案。

我添加了

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

现在,只要订阅的光标发生变化(例如,当用户搜索并更改searchQuery被动变量时),Tracker功能将清除本地集合,然后重新填充。