1

ノックアウト初心者です。ko.utils.arrayFilter を使用しようとしましたが、使用しても更新されないようです。arrayForEach で使用したのと同じ方法を使用しているため、ここで何が問題なのかわかりません。arrayFilter を使用しているときに更新するリストを取得するにはどうすればよいですか?

JS:

function entry(name, category) {
    this.name = ko.observable(name);
    this.category = ko.observable(category);
}

function entriesModel() {
    this.entries = ko.observableArray([]);
    this.filter = function () {
        ko.utils.arrayFilter(this.entries(), function (item) {
            return item.category == 'SciFi';
        });
    };
    this.sort = function () {
        this.entries.sort(function (a, b) {
            return a.category < b.category ? -1 : 1;
        });
    };
}

$(document).ready(function () {
    $.getJSON("entries.php", function (data) {
        entries(data);
    });
    ko.applyBindings(entriesModel());
});

HTML:

<ul data-bind="foreach: entries">
<li>
    <p data-bind="text: name"></p>

    <p data-bind="text: category"></p>
</li>

<button data-bind="click: filter">Filter</button>
<button data-bind="click: sort">Sort</button>

JSON:

[{"id":"1","name":"Iron Man","category":"SciFi"},{"id":"2","name":"Terminator","category":"SciFi"},{"id":"3","name":"The Pianist","category":"Drama"},{"id":"4","name":"The Hangover","category":"Comedy"}]
4

3 に答える 3

0

ko.utils.arrayFilter配列をその場でフィルタリングしません。フィルタリングされたアイテムを含む新しい配列を返し、元の配列はそのままにします。

使用方法の例は次のko.utils.arrayFilterとおりです: http://www.knockmeout.net/2011/04/utility-functions-in-knockoutjs.html

于 2013-09-15T06:20:33.407 に答える
0

これがまさにあなたが望むものかどうかはわかりませんが、フィルター関数はインプレース フィルターを実行しないため、新しいフィルター処理された配列で observableArray を再割り当てする必要があります。そのような

this.filter = function () {
    this.entries(ko.utils.arrayFilter(this.entries(), function (item) {
        return item.category == 'SciFi';
    }));
};

ここを参照してください:http://jsfiddle.net/aKfUc/1/

配列を永続的に変更したくない場合は、ko.computed observable を使用することをお勧めします。

http://knockoutjs.com/documentation/computedObservables.html

于 2013-09-15T06:20:41.720 に答える