如何让Meteor反应性地更新“time”字符串?

时间:2015-07-27 06:35:23

标签: javascript meteor meteor-blaze meteor-helper

我想在我的模板中实现一个帮助器,它将显示自特定时间戳以来的时间。

Template.postItem.helpers({
  timeSinceString: function(timestamp) {
    return moment(timestamp).fromNow();
  }
});

加载时工作正常,但除非重新加载模板,否则不会更新。这是可以理解的,因为没有跟踪fromNow()函数。如何确保用户看到的内容保持最新状态?

一些例子:

  • “5小时前”
  • “几秒钟前”
  • “1天前”

4 个答案:

答案 0 :(得分:1)

我发现这个包非常简单:https://atmospherejs.com/copleykj/livestamp

答案 1 :(得分:1)

我使用mizzao:timesync包(我写的)与moment.js结合使用来生成这些特定的字符串。

mizzao:timesync非常有用,因为它允许您通过计算NTP样式的偏移量在客户端上使用服务器时间,因此即使客户端时间错误,时间也是准确的。它还可以有效地将反应计时器组合在一起,以更新屏幕上的所有时间戳。

示例是mizzao:user-status演示的一部分:http://user-status.meteor.com/

答案 2 :(得分:0)

在渲染时加载一个更新会话变量的函数:

Template.postItem.rendered(function() {
  setInterval(function() {
    Session.set('currentTime', moment());
  }, 1000); // Replace 1000 with your level of time detail
});

Template.postItem.helpers({
  timeSinceString: function(timestamp) {
    return Session.get('currentTime').from(moment(timestamp));
  }
});

答案 3 :(得分:0)

remcoder:chronos包提供了一种非常有用的方法来完成此操作。它定义了一个自我更新的反应时间变量。

注意:默认更新间隔为一秒。我发现在实践中,当显示许多时间变量时,这可能会导致严重的cpu周期。对于快速变化的事物(如文件上传进度表),我使用一秒钟。对于速度较慢的东西,我用了20分钟。