【发布时间】:2014-01-25 07:54:45
【问题描述】:
我的 Appmodel 包含一个可观察的 cmets 数组
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,建立 App 模型......)时非常有效,但是当我向数组添加注释时,计算无法识别数组项的数量已更改(据我了解,可观察数组只是观察数组属性本身的可观察对象)。所以当我这样做时:
self.comments.push(aNewCommentObject);
self.lastComment 仍然绑定到数组项,即应用最初加载时的状态。
我发现this blog post 如何通过引入一个虚拟的 observable 来强制计算,但我不喜欢这种方法。那么 observableArray 用于什么目的以及如何使用?
其他挑战:我希望在任何情况下都对 observableArray 项进行排序(因为它是一个应该按时间顺序排序的评论提要)。我尝试使用计算出的commentsSorted 来执行此操作,但也存在当 observableArray 有新项目时它不会更新的问题,所以这里也有同样的问题。这就是为什么我每次都在 firstComment 和 lastComment 中排序的原因。
【问题讨论】:
标签: javascript arrays knockout.js