模板助手内的流星重新活动问题

时间:2014-07-14 14:41:48

标签: meteor

我目前有一个模板,我使用以下查询查询数据库。

allMessages = Messages.find({$or: [{type: "user_message"}, {type: "system_message", time: {$gt: (Date.now() - 180000)} }]}, {sort: {time: 1 }}).fetch()

现在很明显,只要有新内容进入或从这组数据中删除,模板助手就会重新运行,这正是我想要的。当system_message超过2分钟并且我不再希望通过我的查询之外的那条消息时,会出现此问题。发生这种情况时,数据不会更新,只会在新邮件进入时或由于某种原因删除邮件时更新。

有谁知道为什么会这样?在我看来,由于查询数据正在发生变化而不应该出现问题,所以它应该重新运行,但它不是。

1 个答案:

答案 0 :(得分:2)

它不起作用,因为Date.now()不是一个反应变量。如果您要设置会话变量或ReactiveDict等日期限制,则会导致帮助程序重新计算。以下是使用Session

的示例
Template.myTemplate.allMessages = function() {
  var oldestMessageDate = Session.get('oldestMessageDate');
  var selector = {
    $or: [
      {type: "user_message"},
      {type: "system_message", time: {$gt: oldestMessageDate}}
    ]
  };
  return Messages.find(selector, {sort: {time: 1}});
};

Template.myTemplate.created = function() {
  this.intervalId = Meteor.setInterval(function() {
    Session.set('oldestMessageDate', new Date - 120000);
  }, 1000);
};

Template.myTemplate.destroyed = function() {
  Meteor.clearInterval(this.intervalId);
};

创建模板后每隔一秒,它会将oldestMessageDate更改为过去两分钟的新日期。请注意,intervalId存储在模板实例中,稍后会在destroyed回调中进行清理,因此在模板不再使用后,它将无法继续运行。由于oldestMessageDate是一个反应变量,因此它应该会导致您的allMessages助手不断重新运行。

相关问题