2012-02-09 45 views
3

我需要將ViewModel中的主源代碼中的一些數據克隆到對話框中。原因是用戶可以取消對話框,我不希望主人反映這些取消的更改。如何使用敲除映射克隆和重新綁定我的數據?

我在對話框中創建主數據的複製副本,並將數據綁定設置爲拾取「本地編輯的*」特性。如果用戶點擊確定,那麼我會嘗試將數據保存到主數據庫中(如果它已編輯),否則請將數據按其新數據進行推送。

editItem: function(data) { 
      // clone a temporary copy for the dialog      
      this.localEdited = ko.mapping.fromJS(ko.toJS(data));    
      $("#dlgAdd").dialog("open"); 
     }, 

以上目前的工作,但是,如果我點擊主人的另一個項目,該對話框不顯示更新的值。它好像ko.mapping.fromJS只能工作一次,然後再也不會。它總是拿起第一個值。我如何解決這個問題?我覺得我需要重新綁定價值觀,但是KO的全部意義在於不必這樣做。

我該如何將數據持久化回父項。我想我可能會遇到與上面相同的問題。

順便說一句,我正在使用KnockoutJS 1.2.1。

回答

4

localEdited需要是可觀察的,你應該在editItem函數中做this.localEdited(ko.mapping.fromJS(ko.toJS(data)))函數,以在每次調用editItem的時候使knockout重新綁定對話框。在該對話框中的數據綁定將需要改變以localEdited()。*

你可以逃脫不localEdited是可觀的,但在這種情況下,你將需要editItem功能手動更新的localEdited每個觀察特性。所以你必須有類似的東西

this.localEdited.property1(data.property1()); 
this.localEdited.property2(data.property2()); 

關鍵是你需要使用函數調用語法來更新observables。這樣淘汰賽將捕獲更新並通過綁定傳播它。在你的初始代碼中,你只需要簡單地分配到localEdited,所以淘汰賽不會有攔截併發揮其魔力的鉤子。

UPDATE: 原來ko.mapping插件可以在模型中自動更新個別觀測,所以你不必做手工:

ko.mapping.fromJS(ko.toJS(data), this.localEdited); 
+0

這個好,謝謝。爲什麼當所有的單個屬性都是包裝的'localEdited'本身必須是可觀察的? – jaffa 2012-02-09 17:34:29

+0

你可以不用localEdited就可以觀察到,但在這種情況下,你需要手動更新editItem函數中localEdited的每個observable屬性。所以你將不得不有這樣的this.localEdited.property1(data.property1()); this.localEdited.property2(data.property2());等等 – 2012-02-09 17:38:45

+0

好吧我現在明白了,當每個任務需要更新UI時,淘汰賽需要一些知道的方法。在這種情況下,可觀察的分配是鉤子。如果我明白,我知道它是一個很好的解釋! – jaffa 2012-02-09 23:23:17