我无法实现具有移动日期的被动出版物。我有一个包含活动/会议的日历应用程序。我在特殊视图页面上显示这些事件,但我只想显示今天的事件,并且只显示当前时间的开始时间 - 30分钟。
代码即时通讯和尝试始终在初始加载时工作正常,刷新后以及从管理页面添加/删除事件时(集合会刷新?)。但是当我离开页面时,已经过去的事件只会停留在页面上。每当我通过管理页面添加/删除事件时,发布都会更新。我假设这是因为发布没有刷新查询中的日期或什么?
我试过了:
但我只是得到了相同的结果。
使用observeChanges发布:
Meteor.publish('currentEventsObserve', function(calId) {
var self = this;
var nowMin30mins = moment().subtract('minutes',30).valueOf();
var endOfToday = moment(moment().format('DD-MM-YYYY 23:59'), 'DD-MM-YYYY HH:mm').valueOf();
var handle = Events.find({
calId : calId, //CalendarId
eventDate: { $gt: nowMin30mins, $lt: endOfToday }
},
{
sort: { eventDate: 1 },
limit: 5
}).observeChanges({
added: function(id,event){
//console.log("added: ",id,event);
self.added("events", id, event);
},
removed: function (id,event) {
//console.log("removed: ",id,event);
self.removed("events", id);
}
});
self.ready();
self.onStop(function () {
handle.stop();
});
});
如前所述:上述工作在初始加载和刷新时工作正常,但在页面打开一段时间之后,事件仍然停留在那里而不会从发布中删除。
此外,每当我检查集合时,某些事件应该已经通过Events.find()。fetch()删除了,例如,事件仍然存在,因此它不是未正确更新的模板。 / p>
我希望我的意思很清楚。我已经阅读了很多关于这种反应性的其他问题,但我无法弄明白。
答案 0 :(得分:1)
问题在于nowMin30mins
仅在激活发布时计算一次,并且即使您observeChanges
上有Events
,也不会在之后更新。您基本上有两个常量值(nowMin30mins
和endOfToday
)包围将要显示的文档,只有添加或删除项目才会使它们消失。
我可以想出两种方式,让你想要如何做到这一点。
您可以将所有反应性放在客户端上。只需在发布中发送整天的事件,这非常简单,让客户端在每分钟更新一次的计算中使用Date.now()
过滤掉从现在开始到当天结束的时间,或者添加/删除新事件时。无论如何,它似乎不会产生很多开销来存储这些事件,你可以减轻观察的计算成本,如果你有很多客户就可以积累这些成本
如果你想在服务器上这样做,你必须比你现在做的更仔细。由于实时查询不会考虑时间的变化,因此您需要观看今天的所有事件,然后分别在创建,删除或超出范围时添加或删除订阅。重申一下,你不能仅仅使用observeChanges
这样做,因为当前时间总是在变化。