1

フィルター処理され、ソートされたバージョンを返す計算されたオブザーバブルがあります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が指摘したように、ソート関数が「name」プロパティに正しくアクセスしていません。さらに、「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 に答える