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);
しかし、何も機能していません。インデックスは適切に取得されていますが、アイテムの更新は行われていません。
置換関数は、置換するアイテムと置換する新しいアイテムの2つのパラメーターを受け入れます。置き換えるアイテムの代わりにインデックスを渡しているため、機能しません。
置換呼び出しは次のようになります。
_self.locations.replace(oldLocation, new location(value));
_
補足説明として、valueHasMutated()
呼び出しは必要ありません。replace()
呼び出しによって呼び出されます。
私はそれを行うための代替方法に言及したいだけです:
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
が以前のバージョンで欠落していたかどうかはわかりません)。
JavaScriptの配列、またはKnockoutのreplaceメソッドを知りません。何か不足していますか?
2番目の方法を使用する場合は、観測可能な場所として場所にアクセスする必要があります。
self.locations()[self.locations.indexOf(location)] = new fizi.ko.models.location(value);
self.locations.valueHasMutated();
ただし、indexOfを使用する場合は、観察可能な配列用のKnockoutバージョンがあるため、使用しません。