在我的模板中,我有以下代码
{{#each cards}}
...
<h4>Time left {{timeLeft validUntil}}</h4>
<div class="clearfix"></div>
....
{{/each}}
在数据库中我有一个像这样的示例卡
{groupId: groupId, posted: new Date(),validUntil:moment().add(24,'h').toDate()});
模板助手
Template.groupDetails.helpers({
timeLeft: function(validUntil){
var diff = moment.duration(moment().diff(validUntil));
return [diff.hours()*-1, diff.minutes()*-1, diff.seconds()*-1].join(':')
}
});
然后我创建了一个setIntervall,它使用模板上创建的事件
Template.groupDetails.created = function() {
Meteor.setInterval( updateTimers, 5000 );
};
我有函数updateTimers:
function updateTimers() { };
我有很多东西,比如在数据库中添加一个timeLeft int,但是当我已经创建了validUntil并且已经存在时,将它放在数据库中会感觉很浪费。
如何从每5秒调用的函数更新所有卡片中的时间段?
我尝试过这样的解决方法:https://github.com/meteor/meteor/issues/1172
但这感觉就像一个可怕的黑客
答案 0 :(得分:0)
您链接的解决方案并不是真正的黑客,而是Meteor的工作方式(尽管在这种情况下您不应该使用Session
)。您可以指定依赖项,使依赖计算无效,而让Meteor和Blaze负责渲染,而不是显式重新渲染模板。
在您的示例中,您可以像这样创建Tracker.Dependency
:
var timerDep = new Tracker.Dependency;
帮助者必须依赖timerDep
:
timeLeft: function() {
timerDep.depend();
…
}
最后,你每隔五秒就使助手的计算无效:
function updateTimers() {
timerDep.changed();
}
这样,当validUntil
更改或计时器到期时,您的帮助程序将重新运行。