如何使用meteor定期更新变量

时间:2014-12-10 23:24:45

标签: javascript meteor setinterval

我有一个会话变量,我想以固定的周期更新。说,我希望这个变量每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,而会话变量的新值反映在应用程序中,当变量是调整。

(如果有一个直截了当且完全不同的解决方案适用于流星,我不知道它,所以如果我错过了一些明显的东西,请指出我。)

1 个答案:

答案 0 :(得分:14)

虽然您使用的是反应变量,但它只会被设置一次 - 首次调用帮助程序时。因此它不会再次运行。您需要帮助程序的外部功能来为您设置变量。请记住一条重要规则 - 帮助者永远不会拥有side effects

以下是如何创建计时器的完整工作示例:

HTML

<body>
  {{> timer}}
</body>

<template name="timer">
  <p>Total Seconds: {{seconds}}</p>
</template>

JS

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);
};