1

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

这是我的小提琴

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);
        });
    });
}

答案 这是更新小提琴

4

2 回答 2

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);
    });
于 2013-03-21T15:55:26.937 回答
1

您的sort函数未正确调用可观察对象:

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

我也更新了你的小提琴,这似乎有效。

于 2013-03-21T15:53:26.593 回答