javascript - knockout.js 不对可观察数组进行排序

标签 javascript arrays sorting knockout.js ko.observablearray

我这辈子都无法对这个数组进行适当的排序。我知道排序功能有效,但某种排序的时间已关闭。似乎无法弄清楚。

用户界面

 <!-- ko foreach: Times.sort(function (l, r) { app.utils.orderTime(l.Time(), r.Time()); }) -->

Javascript

function Day(date, updated) {

        var self = this;

        self.Times = ko.observableArray([]);

        var times = ko.utils.arrayMap(date.Times, function (item) {
            return new Time(item, updated);
        });

        self.Times.push.apply(self.Times, times);
    }

排序功能

app.utils.orderTime = function(l, r) {  // l = "9:00 AM", r = "11:00 PM"
    var leftFormatted = new Date('1/1/2012 ' + l); // Sun Jan 01 2012 09:00:00 GMT-0700
    var rightFormatted = new Date('1/1/2012 ' + r); // Sun Jan 01 2012 23:00:00 GMT-0700

    return leftFormatted.compareTo(rightFormatted); // -1
};

更新:

我继续添加了一个名为 TimeSorted 的计算并且排序很好,但是我不能将任何东西插入时间数组并更新它,除非我有 self.Times().sort(...相反,但订单不会保留。

        self.TimesSorted = ko.computed(function() {
            return self.Times.sort(function (l, r) { app.utils.orderTime(l.Time(), r.Time()); });
        });

 <!-- ko foreach: TimesSorted -->

最佳答案

sort 方法修改了它所作用的数组,从而改变了原始数组。它也返回那个数组的事实让很多人感到困惑。像这样的绑定(bind)不应该修改数组;它应该使用数组的副本:

<!-- ko foreach: Times.slice(0).sort(...) -->

可观察数组sort方法改变数组(就像pushsplice等)并通知订阅者改变。它不会在绑定(bind)或计算可观察对象中创建对数组的依赖。另一方面,slice 方法确实创建了一个依赖项。

如果您真的想对原始数组进行排序,那么这真的不应该在绑定(bind)中完成。我建议您使用这样的扩展器:

ko.extenders.sorted = function (obs, sortFunction) {
    obs.sort(sortFunction);
    obs.subscribe(function (array) {
        array.sort(sortFunction);
    });
}

...

self.Times = ko.observableArray([]).extend({ sorted: function (l, r) { return app.utils.orderTime(l.Time(), r.Time()); } });

示例:http://jsfiddle.net/mbest/f3SX2/

关于javascript - knockout.js 不对可观察数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22870680/

相关文章:

javascript - 工具提示无法正常工作谷歌饼图

javascript - jQuery 隐藏字段未设置多次

javascript - 带有外部节点的 jstree 上下文菜单

javascript - 两个 Trie 节点之间的最短路径

arrays - 如何使用搜索栏对字典数组进行排序

javascript - 如何选择 id 取决于 javascript 变量的行?

java - 转换前后字节数组长度不同

我可以将 memcmp 与 qsort 一起使用吗?

C 程序增加传递的数组的每个元素

java - Java中按字符对字符串列表进行排序