我有一个对象数组,它们连接到一个淘汰赛可观察数组中。我需要对这些数组应用排序,我遇到了一些有点令人困惑的行为。
我的第一次尝试涉及在 foreach 数据绑定中应用排序。
http://jsfiddle.net/wnfXV/
<ul data-bind="foreach: people.sort(function(l,r) { return l.name == r.name ? 0 : (l.name < r.name ? -1 : 1)})">
这执行了正确的排序,但我失去了从数组中动态添加/删除元素并更新 DOM 的能力。
如果我添加一组括号来访问底层 JavaScript 数组,一切正常。
<ul data-bind="foreach: people().sort(function(l,r) { return l.name == r.name ? 0 : (l.name < r.name ? -1 : 1)})">
根据我找到的一些 SO 答案,我最终为排序数组创建了一个计算的 observable。 http://jsfiddle.net/wnfXV/2/
self.sortedPeople = ko.computed(function() {
return self.people().sort(function(l,r) {
return l.name == r.name ? 0 : (l.name < r.name ? -1 : 1);
});
});
这也有效。而且我什至不需要将数据绑定到计算出的 observable,因为它会立即执行。我可以推送和删除数组项,并适当地更新 DOM。
但是,如果我将代码更改为:
self.sortedPeople = ko.computed(function() {
return self.people.sort(function(l,r) {
return l.name == r.name ? 0 : (l.name < r.name ? -1 : 1);
});
});
现在,我可以将项目推送到数组和 DOM 更新,但数据没有被排序。
我认为这些差异与剔除依赖跟踪有关,以及在可观察数组上操作与其下面的本机 JavaScript 数组之间的差异,但我很难概念化为什么行为会发生变化。我能够让它工作,但我也很好奇什么被认为是最佳实践。
谢谢你的帮助。:)