Javascript KnockoutJS-以设定的时间间隔重新计算计算值

Javascript KnockoutJS-以设定的时间间隔重新计算计算值,javascript,knockout.js,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年前或1分钟前 我的目标是让self.dateFromNow重新计算每个设定的时间间

我这里有这个密码

self.timestamp = ko.observable(data.timestamp);
self.dateFromNow = ko.computed(function ()
{
    return moment(self.timestamp()).fromNow();
}, self);
self.timestamp
只是一个unix时间戳

self.dateFromNow
看起来像
44年前
1分钟前

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

这些属性绑定到HTML
元素,但我不想通过使用JS/jQuery检查元素并重新计算来进行重新计算。 我认为更好的方法是只需在每个设定的时间间隔重新计算KnockoutJS中的值,然后让KO更新标记

有没有办法在KnockoutJS中做到这一点

更新:我所做的是这样的,而不是海报上的答案

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

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

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

另一种处理方法是,每当另一个可观察值发生变化时,重新评估计算值,该值会按一定间隔变化。听起来很疯狂

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()){}之类内容的计算都将在该值更改后重新计算。

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

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()){}之类内容的计算都将在该值更改后重新计算。

感谢您的回复。理论上,我可以循环约束元素并强制它们重新计算。我只是希望KO可以通过扩展器或自定义绑定实现这一点。不客气。但是,为什么要处理DOM元素来强制更新呢?MVVM的美妙之处在于,您可以从值的显示中抽象出值的行为。如果让VM负责更新它的值,那么无论它是否绑定到标签、输入等,更新行为都将被保留。这正是我不想处理DOM元素的原因。我所做的是按照您的建议,将setInterval函数添加到模型中以定期更新属性<代码>设置间隔(函数(){$.each(self.foo(),函数(索引,项){item.timestamp.notifySubscribers();});},60*1000);//60*1000密耳秒感谢您的回复。理论上,我可以循环约束元素并强制它们重新计算。我只是希望KO可以通过扩展器或自定义绑定实现这一点。不客气。但是,为什么要处理DOM元素来强制更新呢?MVVM的美妙之处在于,您可以从值的显示中抽象出值的行为。如果让VM负责更新它的值,那么无论它是否绑定到标签、输入等,更新行为都将被保留。这正是我不想处理DOM元素的原因。我所做的是按照您的建议,将setInterval函数添加到模型中以定期更新属性<代码>设置间隔(函数(){$.each(self.foo(),函数(索引,项){item.timestamp.notifySubscribers();});},60*1000);//60*1000密耳秒感谢您的回复。这也可以,但我认为只使用
notifySubscribers()
会更容易,谢谢您的回复。这也可以工作,但我认为只使用
notifySubscribers()