我这里有这段代码
self.timestamp = ko.observable(data.timestamp);
self.dateFromNow = ko.computed(function ()
{
return moment(self.timestamp()).fromNow();
}, self);
self.timestamp
只是一个unix时间戳
self.dateFromNow
看起来像44 years ago
或1 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
答案 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)
没有进入淘汰赛,没有(至少,据我所知)。它有一个机制(限制),限制视图模型更改传播的频率,但显然这不是你想要的。可以说,您的视图模型上应该有一个成员绑定到您的元素,然后您有责任定期更新您的视图模型。