更新多个模板meteorjs

时间:2015-12-31 13:27:34

标签: meteor

在我的模板中,我有以下代码

{{#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

但这感觉就像一个可怕的黑客

1 个答案:

答案 0 :(得分:0)

您链接的解决方案并不是真正的黑客,而是Meteor的工作方式(尽管在这种情况下您不应该使用Session)。您可以指定依赖项,使依赖计算无效,而让Meteor和Blaze负责渲染,而不是显式重新渲染模板。

在您的示例中,您可以像这样创建Tracker.Dependency

var timerDep = new Tracker.Dependency;

帮助者必须依赖timerDep

timeLeft: function() {
  timerDep.depend();
  …
}

最后,你每隔五秒就使助手的计算无效:

function updateTimers() {
  timerDep.changed();
}

这样,当validUntil更改或计时器到期时,您的帮助程序将重新运行。