2

我这里有这段代码

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
4

2 回答 2

3

处理此问题的另一种方法是在另一个可观察值更改时重新评估计算值,该值在间隔上更改。听起来很疯狂?

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()) { } 之类的计算都将重新评估。

于 2013-09-25T02:39:06.710 回答
1

没有内置于淘汰赛中,没有(至少,据我所知)。它有一种机制(节流)来限制视图模型更改传播的频率,但显然这不是您所追求的。可以说,您应该在视图模型上拥有一个绑定到元素的成员,然后您有责任定期更新视图模型。

于 2013-09-25T01:13:30.033 回答