KnockoutJS - 使用设定的时间间隔重新计算计算值

时间:2013-09-25 00:57:59

标签: javascript knockout.js

我这里有这段代码

self.timestamp = ko.observable(data.timestamp);
self.dateFromNow = ko.computed(function ()
{
    return moment(self.timestamp()).fromNow();
}, self);

self.timestamp只是一个unix时间戳

self.dateFromNow看起来像44 years ago1 minute ago

我的目标是self.dateFromNow重新计算每个设定的时间间隔。

这些属性绑定到HTML <time>元素,但我不想通过使用JS / jQuery来重新计算元素并重新计算。 我认为更好的方法就是在每个设定的时间间隔内简单地重新计算KnockoutJS中的值,然后让KO更新标记。

有没有办法在KnockoutJS中执行此操作?

更新:我所做的就是这样的,取代了海报的答案

setInterval(function() {
  $.each(self.foo(), function(index, item) {
    item.timestamp.notifySubscribers();
  });
}, 60 * 1000); // 60 * 1000 milsec

2 个答案:

答案 0 :(得分:3)

处理这种情况的另一种方法是每当另一个observable更改值时重新计算计算值,该值在一个间隔上发生变化。听起来很疯狂吗?

var fireEvaluations = ko.observable(0);

// Somewhere after the DOM is ready
setInterval(function () {
    fireEvaluations(fireEvaluations() + 1);
}, 6000);

var someOtherObservable = ko.computed(function () {
    // Subscribe to the triggering observable
    if (fireEvaluations()) { }
    // Do your real code
});

现在所有具有if(fireEvaluations()){}之类的计算器将在该值发生变化后重新进行评估。

答案 1 :(得分:1)

没有进入淘汰赛,没有(至少,据我所知)。它有一个机制(限制),限制视图模型更改传播的频率,但显然这不是你想要的。可以说,您的视图模型上应该有一个成员绑定到您的元素,然后您有责任定期更新您的视图模型。