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