いくつかのアイテムを一覧表示する小さなフィドルを使用して、ネストされたknockoutjsビューモデルを作成する方法を理解しようとしています。ボタンをクリックすると、そのアイテムの詳細が表示されます。次に、各アイテムに15を追加することで各アイテムのIdプロパティを更新するボタンがありますが、理由により、最終的にはすべて同じ値になります。誰かが私を啓発できますか?
ありがとう!
いくつかのアイテムを一覧表示する小さなフィドルを使用して、ネストされたknockoutjsビューモデルを作成する方法を理解しようとしています。ボタンをクリックすると、そのアイテムの詳細が表示されます。次に、各アイテムに15を追加することで各アイテムのIdプロパティを更新するボタンがありますが、理由により、最終的にはすべて同じ値になります。誰かが私を啓発できますか?
ありがとう!
それはあなたの.Name
計算された特性です。IDの変更は正しく機能します。
http://fiddle.jshell.net/Y3JXD/1/
item
クロージャー内は、最初の実行後、常にitem
リストの最後でした。観測可能な変化が発生するたびに、計算値が更新されることに注意してください。したがって、最初のセットアップでは、ループからの場合と同様item
に正常に機能しました。item
しかし、クロージャーでキャプチャされたのはitem
(15番目のアイテム)であり、その特定のループインスタンス用のものではありませんでした。
更新:コメントで提案されているように計算される2番目のパラメーターを忘れました。
http://fiddle.jshell.net/Y3JXD/1/
item.Name = ko.computed(function () { return 'Item_' + item.Id(); }, item);
参照をクロージャーでラップし、適切item
なインスタンスをキャプチャするための別の手法を次に示します(適切なスコープをキャプチャするために何が必要かを示すためのデモンストレーションとして)。
self.loadItems = function () {
for (var i = 0; i < 15; i++) {
var item = ko.mapping.fromJS({
Id: i
});
self.items.push(item);
(function (item) {
item.Name = ko.computed(function () {
return 'Item_' + item.Id();
});
})(item);
}
};
Name
プロパティをに移動できますitemModel
か?
self.Name = ko.computed(function() {
return 'Item_' + self.Id();
});
オブジェクトを消費するときではなく、作成するときに設定するのは奇妙に思えます。