如何创建具有可变momentjs日期的响应式流星出版物

时间:2014-01-28 11:00:47

标签: meteor momentjs

我无法实现具有移动日期的被动出版物。我有一个包含活动/会议的日历应用程序。我在特殊视图页面上显示这些事件,但我只想显示今天的事件,并且只显示当前时间的开始时间 - 30分钟。

代码即时通讯和尝试始终在初始加载时工作正常,刷新后以及从管理页面添加/删除事件时(集合会刷新?)。但是当我离开页面时,已经过去的事件只会停留在页面上。每当我通过管理页面添加/删除事件时,发布都会更新。我假设这是因为发布没有刷新查询中的日期或什么?

我试过了:

  • 正常出版物,只需通过铁路由器订阅 在挂钩之前或通过Deps.autorun
  • 在客户端发布所有事件并进行过滤
  • 带有observeChanges的出版物
  • 将变量保存在deps.autorun函数中并通过订阅作为参数传递

但我只是得到了相同的结果。

使用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>

我希望我的意思很清楚。我已经阅读了很多关于这种反应性的其他问题,但我无法弄明白。

1 个答案:

答案 0 :(得分:1)

问题在于nowMin30mins仅在激活发布时计算一次,并且即使您observeChanges上有Events,也不会在之后更新。您基本上有两个常量值(nowMin30minsendOfToday)包围将要显示的文档,只有添加或删除项目才会使它们消失。

我可以想出两种方式,让你想要如何做到这一点。

  • 您可以将所有反应性放在客户端上。只需在发布中发送整天的事件,这非常简单,让客户端在每分钟更新一次的计算中使用Date.now()过滤掉从现在开始到当天结束的时间,或者添加/删除新事件时。无论如何,它似乎不会产生很多开销来存储这些事件,你可以减轻观察的计算成本,如果你有很多客户就可以积累这些成本

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