【问题标题】:Duplicate IDs in Local Collection when Meteor subscription changesMeteor 订阅更改时本地集合中的重复 ID
【发布时间】:2017-02-16 00:56:56
【问题描述】:

这是我的场景:

我有一组日历事件。有些事件附有重复规则。当我在客户端订阅事件时,我正在创建一个名为LocalEvents 的新本地集合。我循环浏览从Events 集合发布的所有事件,并为每次发生的事件向我的本地集合中插入一个新文档。

这是我的 cmets 代码

//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 更改时集合在我的容器中正确清空?

提前致谢

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

我添加了我找到的解决方案作为答案

【问题讨论】:

    标签: meteor minimongo


    【解决方案1】:

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

    我加了

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-07
      • 2021-07-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多