2013-06-19 86 views
3

我已經在這裏發佈我的代碼:http://jsfiddle.net/HYDU6/6/ 這是一個相當精簡的版本,我實際上在處理什麼,但捕獲了我的問題的本質。我的看法模式是像這樣:淘汰賽映射插件[創建,更新]:創建的對象,無法更新

var viewModel = { 
    objects: { 
     foo: [ 
      { text: "Foo's initial" }, 
     ], 
     bar: [ 
      { text: "Bar's initial" }, 
     ] 
    } 
} 

我使用ko.mapping插件和我create處理程序objects實例從objects.fooObj然後objects.bar,返回數組中得到的兩個項目。這部分工作正常;我用

var view = {}; 
ko.mapping.fromJS(viewModel, mapping, view); 

我的問題是基於新數據進行更新。 (即從服務器獲取數據)。我有新的數據的對象,我嘗試

ko.mapping.fromJS(new_model, mapping, view); 

我懷疑這是不正確,但我一直沒能得到廣泛的,儘管它的搜索工作。 (相信我,這是幾天。):無論如何,謝謝你的幫助。

編輯:所以我主要想通了 - 我太依賴於mapping.fromJS和某些東西沒有被包裹到觀察對象中。我也意識到我不需要create(),只需要update(),因爲它在create()之後被調用。如果您有類似問題,請告訴我!

+0

嗨,約翰,在你的小提琴中有不少不尋常的事情發生。首先,當鏈接到ko.mapping插件時,不要使用github的原始版本,因爲一些嚴格MIME打字的瀏覽器不允許腳本執行。請嘗試使用此版本://cdnjs.cloudflare.com/ajax/libs/knockout.mapping/2.3.5/knockout.mapping.js –

+0

哦,謝謝,這是我的第一個。我會更新它。 –

+0

接下來,我剛開始用你的術語感到困惑。你所稱的「綁定」更恰當地稱爲「視圖模型」。 「綁定」是將視圖模型連接到UI的東西,反之亦然。我會建議對您的帖子進行一些修改以澄清問題。 –

回答

4

約翰,

當使用ko.mapping確保你沒有創建一個新的項目更新數據。你的用戶界面已經綁定到現有的項目,所以你只需要更新現有項目屬性的值;不創造新的。對於您發佈的示例,您需要調整地圖的「更新」方法,以將新值插入到正確的ko.observable屬性中,而不是在其位置創建新對象。根據使用情況,ko.mapping「update」方法有幾個不同的參數列表,第三個參數是地圖的目標對象。你會想更新該對象的屬性。

obj.target[label].items[0].text(obj.data[label][0].text); 

但是,這有點混亂。你可能想要創建第二級映射(創建/更新)來處理「深層」對象層次結構,就像在你的小提琴中一樣。例如,在「foo/bar」級別爲對象創建一個映射,而在另一個「更新」內部使用另一個映射爲子對象obj()創建另一個對ko.fromJS的調用。

解決該問題後,您會遇到幾個簡單的綁定錯誤,您可以使用另一個「with」綁定或一個「foreach」綁定子數組來修復這些錯誤。總的來說,你剛剛遇到了一些常見的陷阱,但沒有太嚴重。您可以在我的博客中瞭解更多關於這些陷阱的信息:http://ryanrahlf.com/getting-started-with-knockout-js-3-things-to-know-on-day-one/

我希望這有助於您!

+0

感謝您的回覆!有趣的是,文檔明確指出'update'映射應該返回它的更新值,並且以前使用Obj訪問器更新數組似乎不適用。但我一定會在下一次機會中嘗試一下。 –

+0

另外,假設我想將一個新項目添加到'objects'集合中?由於我的代碼中的'create'和'update'在整個集合上運行,並且每次都傳遞一個完整的更新'objects',所以肯定有辦法爲KO綁定創建新的'foo'級別的對象? –

+0

如果你只映射單個屬性,那麼我相信你確實想要返回單個值。如果映射嵌套對象,則「update」方法的第三個參數將成爲目標對象。在這種情況下,我相信你想更新那個目標對象的屬性。如果需要,可以通過另一個調用ko.fromJS來完成。 –