現在、いくつかのオブザーバのオブジェクトを保持するラッパーオブジェクトの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...
}
htmlでvm.selectedに何かをバインドしていますか?もしそうでなければ、どうしてノックアウトがこの行のUIを更新するのを期待していますか?vm.selected(new ItemWrapper(resp.entity)); ? –
jsFiddleで何かを実演することができますか?あなたのコードの一部を見る方が簡単でしょう。私はあなたのUIで 'with:selected'をやっているか、' selected'に対してテンプレートを使っていると仮定していますか? –
@RomanBataev:vm.selectedに直接バインドされるものはありません。 editItem()では、渡されたデータはobservableArray内のItemWrapperからのものです。選択した変数は、配列内の項目をポイントします。ポイント(2)は、プロパティを個別に渡すときにUIにOKがバインドされていることを示していますが、ItemWrapperをselected()変数に渡すときは表示されません。 – jaffa