这是我的情景:
我有一系列日历活动。某些事件附加了重复规则。当我订阅客户端中的事件时,我创建了一个名为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更改时,如何确保集合在我的容器中正确清空?
提前致谢
**编辑 - 找到解决方案**
我添加了我找到的解决方案
答案 0 :(得分:0)
对于遇到类似问题的其他人,我设法找到了解决方案。
我添加了
Tracker.autorun(function(allEvents) {
LocalEvents.remove({});
});
现在,只要订阅的光标发生变化(例如,当用户搜索并更改searchQuery
被动变量时),Tracker功能将清除本地集合,然后重新填充。