Knockout Observable数组与排序和Foreach数据

我有一个对象数组,它们被连接到一个可供挖掘的可观察数组中。 我需要对这些数组应用排序,并且遇到了一些令人困惑的行为。

我的第一次尝试涉及在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答案,我最终为排序数组创建了一个计算可观察值。 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更新,但数据未被排序。

我认为这些差异与knockout依赖关系跟踪有关,以及在可观察数组和它下面的本地JavaScript数组之间的区别,但我很难概念化为什么行为正在发生变化。 我能够实现它的工作,但我也很好奇哪些被认为是最佳实践。

谢谢你的帮助。 :)


在你的JS小提琴中,这是因为你的foreach被绑定到人们......而不是被排序的人物。

第一次排序的原因是因为计算运行一次...但不订阅。

但是,当您使用圆括号时,计算结果会再次运行,因为在基础数组上有一些订阅。

编辑:

当您使用括号时,计算器在调用observable时订阅数组。 当订阅的项目改变时,计算被重新执行。


在视图中使用排序的问题实际上不是由KO推荐的,因为通过这种方法, observableArray.sort不会建立对数组的依赖关系 ,因此绑定不会被更新。

所以如果你想让它工作,可以使用

items.slice(0).sort()

更详细的看看
https://github.com/knockout/knockout/issues/1380

小提琴:HTTP://jsfiddle.net/mbest/6dmAn/

链接地址: http://www.djcxy.com/p/18719.html

上一篇: Knockout Observable Array with Sorting and Foreach Data

下一篇: Ember: How to execute a promise after this.send()