1

初期化配列を取り、(http://knockoutjs.com/documentation/fn.html) のようなカスタム関数を使用してフィルター処理しようとしていますが、新しい配列を作成するのではなく、古い配列を上書きするだけです。POをクリックしています。メモリ内では機能していますが、完了するとDOMにバインドされません。これは、既存の配列からアイテムを削除するのではなく、配列を書き換えているためですか?

http://jsfiddle.net/chadrickm/39xsC/

4

2 に答える 2

2

この行でバインディングが壊れるため、これは機能しません。

self.materialTrans = self.materialTrans.filterByProperty("PO", item.PO);

ノックアウトオブザーバブルは上書きできません。それらの値を更新する場合は、新しい値を引数として渡す必要があります。バインディングは、再割り当てによって削除する古い関数に対するものです。この作業を行う1つの方法は、次のようになります。

self.materialTrans(self.materialTrans.filterByProperty("PO", item.PO));

関数を変更して、配列を返すだけにします。

ko.observableArray.fn.filterByProperty = function(propName, matchValue) {

        var allItems = this(),
            matchingItems = [];
        for (var i = 0; i < allItems.length; i++) {
            var current = allItems[i];
            if (ko.utils.unwrapObservable(current[propName]) === matchValue) matchingItems.push(current);
        }
        return matchingItems;
};

これが更新されたフィドルです。私があなたの目標を誤解した場合は、私に知らせてください。

于 2012-08-22T21:30:24.127 に答える
0

それが唯一の問題かどうかはわかりませんが、observableArray の値を設定するには、次のようにします。

self.materialTrans(x);

これの代わりに:

self.materialTrans = x;

もちろん、 x は新しいフィルター処理された配列です。

于 2012-08-22T21:34:48.477 に答える