自提交日期自动更新timeAgo值

时间:2014-06-25 19:59:55

标签: javascript meteor momentjs

编辑:我想我应该让事情变得更加明显 我想要做的是使每分钟自动刷新的提交日期显示“超前”的功能,以便即使模板没有重新渲染也能保持相对准确。

我想在模板中自动更新我的timeago值,但它不起作用。

我试图根据类似问题的答案(https://stackoverflow.com/a/17933506

设置具有反应函数的代码

这是我的代码:

var timeAgoDep = new Deps.Dependency(); // !!!
var timeAgo;
var timeAgoInterval;

Template.postItem.created = function() {
    function getTimeago() {
        //var now = new Date();
        timeAgo = moment(this.submitted).twitter();
        timeAgoDep.changed(); // !!!
    };

    getTimeago(); /* Call it once so that we'll have an initial value */
    timeAgoInterval = Meteor.setInterval(getTimeago, 5000);
};

Template.postItem.posted = function() {
    timeAgoDep.depend(); // !!!
    return timeAgo;
};

Template.postItem.destroyed = function() {
    Meteor.clearInterval(timeAgoInterval);
};

我很确定问题来自于this.submitted,因为如果我分配timeAgo = now例如,它会显示时间和更新,就像它应该的那样。

我也知道时刻(this.submitted).twitter()工作正常,因为当我所做的只是通过帮助器返回它时,它可以工作。

1 个答案:

答案 0 :(得分:1)

更好的方法是接受Meteor的反应性并反复渲染与时间相关的值。在您的情况下,问题是您每5秒为每个postItem呈现的使依赖项无效,这将很快变成一团糟。

请参阅https://github.com/mizzao/meteor-timesync以获取在客户端上提供反应时间变量的程序包(它们也会同步到服务器时间!)它基本上可以按照您想要的方式执行,但方式更清晰。 (免责声明:我写了这个包。)

您可以以相同的方式使用时刻来计算要显示的实际字符串。例如,摆脱所有其他东西,只需使用

Template.postItem.posted = function() {
    return moment(this.submitted).from(TimeSync.serverTime());
}

moment().twitter()扩展名似乎不是一个好选择,因为它只使用当前客户端时间,并且不允许您传入特定(即服务器同步)时间或无效值。