我的 Appmodel 由一系列可观察的评论组成
self.comments=ko.observableArray([]); // Default Value is an empty array
/*
Here comes some code to initially fill the observable array
with items from an JSON Response
*/
此外,我有两个计算值,它们应该代表第一个评论和最后一个评论
self.firstComment = ko.computed(function () {
var sorted = self.comments.sort(function (left, right) {
return left.Id() - right.Id();
});
return sorted[0];
});
self.lastComment = ko.computed(function () {
var sorted = self.comments.sort(function (left, right) {
return left.Id() - right.Id();
});
return sorted[sorted.length - 1];
});
这在初始化应用程序时非常有效(从服务器加载 JSON,构建应用程序模型...),但是当我向数组添加注释时,计算结果无法识别数组项的数量已更改(据我了解)它,可观察数组只是一个可观察的数组,其中观察数组属性本身)。所以当我这样做时:
self.comments.push(aNewCommentObject);
self.lastComment 仍然绑定到数组项,即应用程序最初加载时的值。
我已经发现这篇博文 http://blog.greatrexpectations.com/2012/07/12/forcing-computed-observables-to-refresh-in-knockout/如何通过引入虚拟可观察值来强制计算,但我不喜欢这种方法。那么 observableArray 的用途是什么以及如何使用?
额外挑战:我想在每种情况下都对可观察的数组项进行排序(因为它是一个评论提要,应该按时间顺序排序)。我尝试用计算来做到这一点commentsSorted
但也存在这样的问题:当 observableArray 有新项目时,它不会更新,所以这里也有同样的问题。这就是为什么我每次都在firstComment和lastComment中排序的原因。