34

observableArray内のアイテムのすべてのコンテンツを新しいコンテンツに置き換えようとしています。

var oldLocation = ko.utils.arrayFirst(self.locations(), function (item) {
    return item.id == value.id;
});
self.locations.replace(self.locations.indexOf(oldLocation), new location(value));
self.locations.valueHasMutated();

私も試してみました

self.locations[self.locations.indexOf(location)] = new fizi.ko.models.location(value);

しかし、何も機能していません。インデックスは適切に取得されていますが、アイテムの更新は行われていません。

4

3 に答える 3

52

置換機能は、置換するアイテムと置換する新しいアイテムの2つのパラメーターを受け入れます。置き換えるアイテムの代わりにインデックスを渡して、機能しないようにします。

replace呼び出しは次のようになります。

self.locations.replace(oldLocation, new location(value));

ちなみに、ここでの呼び出しは必要ありません。valueHasMutated()呼び出しによって呼び出されreplace()ます。


ちなみに、ネイティブ配列関数の多くは、監視可能な配列で使用できます。それらは、必要に応じてミューテーションの通知をトリガーする基になる配列値に転送されます。これらには以下が含まれます:

pop、、、、、、、、(読み取り専用)。_ push_reverseshiftsortspliceunshiftslice

Knockoutは、ここで文書化する必要があるこれらの追加のメソッドを提供します(現在はv3.5.1)。

remove、、、、、、、、、removeAll_ destroy_ destroyAll_ indexOf_ replace_ sorted_reversed

于 2013-03-15T19:49:27.507 に答える
4

私は単にそれを行う別の方法に言及したいだけです:

self.locations.splice(
  self.locations.indexOf(location),   // Index of the 1st element to remove
  1,                                  // Number of elements to remote at this index
  new fizi.ko.models.location(value)  // A param for each element to add at the index
);

Knockout にはspliceドキュメントが含まれていますが、含まれていませんreplace: Knockout Obervable Arrays Docs。ただし、ソース コードを見ると、両方の機能が実装されていることがわかります (少なくとも KO 3.0 では、replace以前のバージョンで欠落していたかどうかはわかりません)。

于 2015-01-05T12:23:57.427 に答える
3

配列の JavaScript や Knockout の replace メソッドについては知りません。何か不足していますか?

2 番目の方法を使用する場合は、場所にオブザーバブルとしてアクセスする必要があります。

self.locations()[self.locations.indexOf(location)] = new fizi.ko.models.location(value);
self.locations.valueHasMutated();

indexOf を使用する場合は使用しませんが、監視可能な配列用の Knockout バージョンがあるためです。

于 2013-03-15T19:48:17.693 に答える