2012-02-10 11 views
6

現在、いくつかのオブザーバのオブジェクトを保持するラッパーオブジェクトのobservableArrayにある単一のアイテムに対して、サーバーから新しいデータを取得しているときに、 。新しいデータオブジェクトでノックアウトUIを更新できない

は、次のことを考えてみましょう:

var vm = { 
.... 
localEdited: ko.mapping.fromJS(new ItemWrapper(defaultModelSerialised)), 
selected: ko.observable(null), 
editItem: function(data) { 
    // clone a temporary copy of data for the dialog when opening (*.localEdited on dialog) 
    var clonedData = ko.toJS(data); 
    ko.mapping.fromJS(clonedData, null, this.localEdited); 

    // selected should now point to the item in the obserable array which will be refreshed 
    this.selected(data); 

    // open dialog... 
}, 
submitDialog: function(data) { 

    // submit data to server... 

    // (1) commit the data back to UI (new item is return in resp.entity from server) 
    vm.selected(new ItemWrapper(resp.entity)); 

    // at this point the UI isn't showing the updated value 

    // (2) however if I do this it reflects the data change in the UI 
    this.selected().Name("changed"); // updates the UI. 
} 

vm.selectedにItemWrapperに渡すと、(2)それが動作中のに対し、UIを更新していない理由を誰かが説明することができます。私は、すべての物件について(2)のように各物件を設定する必要はありません。

ItemWrapperはそうのようになります。

function PoolWrapper(pool) { 
    this.Name = ko.observable(pool.Name); 

    // more properties... 
} 
+0

htmlでvm.selectedに何かをバインドしていますか?もしそうでなければ、どうしてノックアウトがこの行のUIを更新するのを期待していますか?vm.selected(new ItemWrapper(resp.entity)); ? –

+0

jsFiddleで何かを実演することができますか?あなたのコードの一部を見る方が簡単でしょう。私はあなたのUIで 'with:selected'をやっているか、' selected'に対してテンプレートを使っていると仮定していますか? –

+0

@RomanBataev:vm.selectedに直接バインドされるものはありません。 editItem()では、渡されたデータはobservableArray内のItemWrapperからのものです。選択した変数は、配列内の項目をポイントします。ポイント(2)は、プロパティを個別に渡すときにUIにOKがバインドされていることを示していますが、ItemWrapperをselected()変数に渡すときは表示されません。 – jaffa

答えて

6

OK-問題があなたのクローンがそれらの上にマッピングするメタデータで終わるとko.mapping.fromJSを呼び出ししようとしたとき、最終的に、これは再帰を引き起こすことがあります。

解決策は、ko.toJSの代わりにko.mapping.toJSを使用してクローンを作成して、(メタデータをマッピングせずに)クリーンなクローンを得ることです。私も、私は私が共有したいと思ったことを今日つまずいhttp://jsfiddle.net/rniemeyer/tDDBp/

+0

ありがとう。なぜko.toJSがマッピングデータを保持し、ko.mapping.toJSがマッピングデータを保持しないのか分かりません。 – jaffa

+0

ko.mapping。toJSはマッピングオプションを特に認識して削除していますが、ko.toJSはマッピングプラグインについて知らないのです。 –

0

何か:

使用してクローンを作成した場合:

var clone = ko.mapping.fromJS(ko.mapping.toJS(itemToClone)); 

を次にクローンになります。ここ

が更新フィドルです任意の計算された観測値を取り除いた。それらは関数の最後の値として存在しますが、もはや計算された観測値としては機能しません。

あなたのアイテムは、以下を行うことができますあなたのクローンに維持したいと考えて計算観測との複雑なモデルの場合:

var clone = ko.mapping.fromJS(ko.mapping.toJS(itemToClone), null, new itemModel()); 

itemModelがあなたの商品があなたの計算された観測を含むため、あなたの複雑なモデルです。

関連する問題