如何创建一个具有可变momentjs日期的反应流星出版物



我在实现带有移动日期的反应式发布时遇到了问题。我有一个包含活动/会议的日历应用程序。我在一个特殊的视图页面上显示这些事件,但我只想显示今天的事件,并且只显示当前时间30分钟的开始时间。

我正在尝试的代码在初次加载时、刷新后以及从管理页面添加/删除事件时(集合被刷新了吗?)总是能正常工作。但当我离开页面打开时,已经过去的事件只会停留在页面上。每当我通过管理页面添加/删除事件时,发布都会更新得很好。我想这是因为发布没有刷新查询中的日期还是其他原因?

我试过:

  • 普通出版物,只需通过任一iron路由器订阅挂钩前或通过Deps.autorun
  • 在客户端发布所有事件和筛选
  • 有观察变化的出版物
  • 将vars保存在deps.autorun函数中,并通过订阅将其作为参数传递

但我一直得到同样的结果。

带有观察者更改的出版物:

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()删除,例如,这些事件仍然存在,所以不是模板没有正确更新。

我希望清楚我的意思。我读过很多关于这种反应性的其他问题,但我就是想不通。

问题是,nowMin30mins在激活发布时只计算一次,之后不会更新,即使Events上有observeChanges。您基本上有两个常数值(nowMin30minsendOfToday)将要显示的文档括起来,只有添加或删除项目才会导致它们消失。

我可以想出两种方法来说明你想如何反应。

  • 您可以将所有反应性放在客户端上。只需在发布中发送一整天的事件,这非常简单,并让客户端在每分钟左右更新一次的计算中,或在添加/删除新事件时,使用Date.now()过滤掉从现在到一天结束的30分钟之间的内容。无论如何,存储这些事件似乎不会产生太多开销,而且你可以卸载观测的计算成本,如果你有很多客户端,这可能会增加

  • 如果你想在服务器上做这件事,你必须比现在做得更仔细一点。由于实时查询不会考虑时间上的变化,因此您需要查看今天的所有事件,然后在创建、删除或超出范围时分别从订阅中添加或删除这些事件。重申一下,您不能纯粹使用observeChanges来实现这一点,因为当前时间总是在变化。

最新更新