web-dev-qa-db-ja.com

observableArrayのアイテムを置き換える

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);

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

31
bflemi3

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

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

_self.locations.replace(oldLocation, new location(value));
_

補足説明として、valueHasMutated()呼び出しは必要ありません。replace()呼び出しによって呼び出されます。

48
Jeff Mercado

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

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が以前のバージョンで欠落していたかどうかはわかりません)。

4
JotaBe

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

2番目の方法を使用する場合は、観測可能な場所として場所にアクセスする必要があります。

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

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

3
Paul Manzotti