我目前有一个模板,我使用以下查询查询数据库。
allMessages = Messages.find({$or: [{type: "user_message"}, {type: "system_message", time: {$gt: (Date.now() - 180000)} }]}, {sort: {time: 1 }}).fetch()
现在很明显,只要有新内容进入或从这组数据中删除,模板助手就会重新运行,这正是我想要的。当system_message
超过2分钟并且我不再希望通过我的查询之外的那条消息时,会出现此问题。发生这种情况时,数据不会更新,只会在新邮件进入时或由于某种原因删除邮件时更新。
有谁知道为什么会这样?在我看来,由于查询数据正在发生变化而不应该出现问题,所以它应该重新运行,但它不是。
答案 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
助手不断重新运行。