我有一个会话变量,我想以固定的周期更新。说,我希望这个变量每60秒增加1。
在我看来,这样做的最佳位置是相关模板的帮助部分。我首先尝试使用setInterval执行此操作,如here所述,但这不起作用(函数似乎没有重复)。
然后我尝试了我认为简单的解决方案,但这也不起作用。见下文。辅助变量' currentPosition'应该返回当天的当前分钟(加上偏移量)。但是,它仅在首次调用模板时以及会话变量“偏移”时执行此操作。在“事件”中定义的功能中进行了更改。部分,响应特定div的点击(' next'按钮)。
currentPosition: function () {
var d = new Date();
var h = d.getHours();
var m = d.getMinutes();
var w = h * 60 + m;
Session.set("position", w + Session.get("offset"));
return Session.get("position");
},
我认为上面的帮助会主动更新' currentPosition'每一分钟。但事实并非如此。
所以,我的问题是,我怎样才能让会话变量每次更改,比方说,60秒,增加它,比如1,而会话变量的新值反映在应用程序中,当变量是调整。
(如果有一个直截了当且完全不同的解决方案适用于流星,我不知道它,所以如果我错过了一些明显的东西,请指出我。)
答案 0 :(得分:14)
虽然您使用的是反应变量,但它只会被设置一次 - 首次调用帮助程序时。因此它不会再次运行。您需要帮助程序的外部功能来为您设置变量。请记住一条重要规则 - 帮助者永远不会拥有side effects。
以下是如何创建计时器的完整工作示例:
<body>
{{> timer}}
</body>
<template name="timer">
<p>Total Seconds: {{seconds}}</p>
</template>
Template.timer.helpers({
seconds: function() {
return Template.instance().seconds.get();
}
});
Template.timer.created = function() {
var self = this;
this.seconds = new ReactiveVar(0);
this.handle = Meteor.setInterval((function() {
self.seconds.set(self.seconds.get() + 1);
}), 1000);
};
Template.timer.destroyed = function() {
Meteor.clearInterval(this.handle);
};