【发布时间】: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 更改时集合在我的容器中正确清空?
提前致谢
** 编辑 - 找到解决方案 **
我添加了我找到的解决方案作为答案
【问题讨论】: