javascript - Meteor Helpers - DOM 操作

标签 javascript meteor meteor-blaze

// Works
var counter = 0;
    var myInterval = Meteor.setInterval(function(){
      counter++;
      var time = moment().hour(0).minute(0).second(counter).format('HH:mm:ss');
      console.log(time);
    }, 1000);

// Inside Helper - Does Not Work

Template.clockRunner.helpers({
  start: function () {
    var counter = 0;
    var time = moment().hour(0).minute(0).second(counter).format('HH:mm:ss');
    var myInterval = Meteor.setInterval(function(){
      counter++
    }, 1000);
    return time;
  },
})

第一个版本控制台以 1 秒为增量记录时间。 Helper 版本在 DOM 中显示“00:00:00”,但不会增加,如果我在 helper 中控制台记录时间,它每秒记录“00:00:00”。

我不确定我是否误解了助手的 react 性质,或者我是否没有看到一个小错误。提前致谢!

最佳答案

助手旨在向 Blaze 模板提供数据;除非从模板调用,否则不会调用它。

也就是说,您应该将助手视为提供数据的东西,它不应该“做任何事情”。当模板呈现时,当 react 数据被处理时,助手可能会以意想不到的方式被多次调用。

我认为您希望在 onRendered() 方法中启动计时器;当模板被放置在屏幕上时被调用一次。 (当模板离开屏幕时会调用相应的方法,因此可以停止计时器)。

一旦定时器启动,您可以将定时器数据写入 react 变量,然后返回该定时器数据的格式化版本的帮助程序。因为它位于响应式(Reactive)变量中,这将确保每次计时器计时时都会重新调用您的助手。

最后一部分只是确保 Blaze 模板引用助手。

关于javascript - Meteor Helpers - DOM 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42210208/

相关文章:

javascript - meteor JS : Input value in a table is displayed twice

javascript - 如何使用 Spin.js 制作微调器?

javascript - Angular、Laravel 4 和 MySQL 数据库最佳实践

javascript - Highstock 图表 - JSON 输入不起作用

macos - Meteor 无法更新包目录。代理问题?

meteor - 如何使用@import 在meteor 中使用更少的mixin 而不会获得多个定义

meteor - 有没有办法等待另一个 WebDriverIO promise 链完成?

javascript - 如何在静态非 Meteor 页面中使用 Tracker.autorun?

javascript - 交付未定义

javascript - 在 js 中监听 laravel livewire 生命周期钩子(Hook)