【问题标题】:Auto update timeAgo value from submitted date从提交日期自动更新 timeAgo 值
【发布时间】:2014-06-25 19:59:54
【问题描述】:

编辑:我认为我应该让事情更明显。
我要做的是使显示从帖子提交日期开始的“时间前”的功能每分钟自动刷新一次,这样即使没有重新渲染模板也能保持相对准确。

我想在我的模板中自动更新我的 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 例如,它将显示时间并按预期更新。

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

【问题讨论】:

    标签: javascript meteor momentjs


    【解决方案1】:

    实现这一点的更好方法是仅采用 Meteor 的反应性并反应性地呈现与时间相关的值。在您的情况下,问题在于您每 5 秒 为每个呈现的 postItem 使依赖项失效一次,这将很快变成一团糟。

    请参阅https://github.com/mizzao/meteor-timesync 以获取在客户端上提供反应时间变量的包(并且它们也同步到服务器时间!)它基本上是在做你想做的事,但以一种更简洁的方式。 (免责声明:我写了这个包。)

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

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

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

    【讨论】:

    • 感谢您的回答,但我认为您没有理解我的问题,我可能应该说得更清楚。当一个帖子被保存时,它的创建时间被保存在“已提交”的文档中。所以它永远不会改变。这很好:它不应该改变。但与此同时,我有一个函数可以环绕该日期并将其转换为 timeago 形式。现在很明显的问题是,该函数仅在模板渲染时执行,因此“时间前”很快变得不准确,所以我希望它自动更新,比如说,每分钟。
    • @oliv23 我相信我已经完全理解了你的问题。我建议您渲染变量timeago(currentTime - creationTime),我建议在其中使用currentTime 的反应值,该值会定期失效,从而自动更新字符串。我链接到的库正是提供了这一点,您可以使用 moment 以您想要的确切格式显示时间。
    • 啊,好的,我明白了。让 timeago 函数依赖于反应性 currentTime 值确实更有意义。我看了一下包,据我了解,我会为此使用 serverTime() 函数,但我如何告诉它多久更新一次?我不想要实时“timeago”,每 60 秒更新一次。
    • @oliv23 这是我们可以在库中允许的东西,但此时它可能是过早的优化。除非您的页面上有数千个 timeago 值,否则 Blaze 的更新计算速度非常快。试一试,看看 Chrome 任务管理器。为了清楚我的建议,看看上面的代码。
    • 是的,我想我不会担心它。可能是您希望在某个时候添加到您的包中的东西。无论如何,感谢您的代码。我实际上已经开始使用它并且它有效,但我最终将 TimeSync.serverTime 直接烘焙到 moment.twitter 中。这样我就得到了反应性和 twitter 语法。
    猜你喜欢
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    • 2014-06-05
    • 2012-07-28
    • 2013-11-20
    • 1970-01-01
    • 1970-01-01
    • 2013-12-11
    相关资源
    最近更新 更多