0

いくつかのアイテムを一覧表示する小さなフィドルを使用して、ネストされたknockoutjsビューモデルを作成する方法を理解しようとしています。ボタンをクリックすると、そのアイテムの詳細が表示されます。次に、各アイテムに15を追加することで各アイテムのIdプロパティを更新するボタンがありますが、理由により、最終的にはすべて同じ値になります。誰かが私を啓発できますか?

ありがとう!

問題のフィドル

4

2 に答える 2

2

それはあなたの.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);
    }
};
于 2013-02-06T13:43:50.440 に答える
0

Nameプロパティをに移動できますitemModelか?

self.Name = ko.computed(function() { 
    return 'Item_' + self.Id();
});

オブジェクトを消費するときではなく、作成するときに設定するのは奇妙に思えます。

于 2013-02-06T13:59:43.883 に答える