2013-12-20 78 views
1

我似乎無法在KO網站或Google搜索中找到任何文檔描述如何在維護綁定時更改視圖模型中的整個對象。在保留綁定的情況下替換Knockout模型中的整個對象

$(function() { 
    var stuff = { 
     IntroData: { 
      SomeObject: { 
       Name: 'Hello' 
      } 
     } 
    }; 

    var someObject = { 
     Name: 'World' 
    } 
    window.viewModel = ko.mapping.fromJS(stuff); 
    ko.applyBindings(window.viewModel); 

    $("#btnUpdateSomeObject").click(function() { 
     try 
     { 
      window.viewModel.IntroData.SomeObject = ko.mapping.fromJS(someObject); 
     } catch(ex) { 
      alert("Failure: " + ex.toString()); 
     } 
    }); 
}); 

我描述的情況在非工作小提琴:http://jsfiddle.net/W5X2b/

這可能嗎?我覺得這對KO來說是一個巨大的缺陷,或者我以某種方式不適當地使用它。

回答

6

這裏的問題在你使用ko.mapping.fromJS
因此,您應該使用ko.mapping.fromJS(someObject, {}, window.viewModel.IntroData.SomeObject);而不是ko.mapping.fromJS(someObject)

  1. someObject您更新的數據。
  2. {}映射選項。
  3. window.viewModel.IntroData.SomeObject您想要更新的目標對象。

Working Demo

更新:
KnockoutJS Mapping Documentation

到ko.mapping.fromJS第三個參數表示目標

+0

啊我不知道還有第三個參數選項。非常感謝你! –

+0

你歡迎,有時你需要更深入地看文檔 –

+1

我看起來更深,但事實證明,我正在吠叫錯誤的樹。在不破壞綁定的情況下修改整個對象的能力看起來像是核心KO功能的一部分,而不是插件。 –

0

是的,這是可能的,但SomeObject需要是可觀察的。

var stuff = { 
    IntroData: { 
     SomeObject: ko.observable({ 
      Name: 'Hello' 
     }) 
    } 
}; 

由於SomeObject是可觀察的,所以當你'設置'它; ko會更新視圖。

window.viewModel.IntroData.SomeObject(ko.mapping.fromJS(someObject)); 

See fiddle

+0

爲什麼'SomeObject需要是一個observable.'?他正在使用已經使用的ko.mapping將屬性轉換爲observales –

+0

如果IntroData和SomeObject不是可觀察對象,則在數據更改時不會刷新視圖。 – Damien

+0

你是對的,但這是通過映射插件自動完成的。請檢查我的[jsfiddle演示](http://jsfiddle.net/W5X2b/1/) –

相關問題