计算返回已排序的observableArray

时间:2013-03-21 15:46:43

标签: javascript knockout.js

我有一个计算的observable,它返回我的observableArray的已过滤的排序版本,但排序根本不起作用。

这是My fiddle

String.prototype.contains = function (value) {
    return this.indexOf(value) != -1;
};

function Item(data) {
    this.name = ko.observable(data);
}

function ViewModel() {
    var self = this;
    this.items = ko.observableArray([new Item('John'), new Item('Pat')]);
    this.filterValue = ko.observable();

    this.filteredItems = ko.computed(function() {
        var filterValue = self.filterValue();

        if(!filterValue)
            return self.items();

        return ko.utils.arrayFilter(self.items(), function(){
            return item.name().toLowerCase().contains(filterValue.toLowerCase());
        }).sort(function(a,b){
            return a.name == b.name ? 0 : (a.name < b.name ? -1 : 1);
        });
    });
}

答案 这是更新fiddle

2 个答案:

答案 0 :(得分:3)

正如@Paul Manzotti所说,您的排序功能没有正确访问“名称”属性。此外,您的“filterValue”为undefined,因此您的函数会在排序之前退出。

这样的事情会使它发挥作用:

    var filtered = filterValue ? ko.utils.arrayFilter(self.items(), function(item){
        return item.name().toLowerCase().contains(filterValue.toLowerCase());
    }) : self.items();

    return filtered.sort(function(a,b){
        return a.name() == b.name() ? 0 : (a.name() < b.name() ? -1 : 1);
    });

答案 1 :(得分:1)

您的sort函数未正确调用observable:

.sort(function(a,b){
        return a.name() == b.name() ? 0 : (a.name() < b.name() ? -1 : 1);
    })

我也更新了您的fiddle,这似乎有效。