前言
有時候,在使用ko.mapping.fromJS的時候,可能有必要去使用mapping的進階用法來定義mapping的詳細過程,以後定義了,以後再調用的時候就不必再定義了。這裡有一些情形,你可能需要使用這些option。
使用keys來使對象unique化
你有一個JavaScript對象,如下:
并且他已經綁定到viewModel
使用map插件,你可以将它map到view model上(沒任何問題):
這裡發生了兩件事:name從Scot變成了Scott,children[0].name從Alicw變成了Alicws。通過調試你可以發現viewModel中的屬性已經發生相應的變化更新。
于是,name像我們期望的一樣更新了,但是在children數組裡,子項Alicw被删除而新項Alicws被添加到數組裡。這不是我們所期望的,我們期望的是隻是把name從Alicw更新成Alicws,不是替換整個item項。發生的原因是,預設情況下mapping plugin插件隻是簡單地比較數組裡的兩個對象是否相等。 因為JavaScript裡{ id : 1, name : 'Alicw' }和{ id : 1, name : 'Alicws' }是不相等的,是以它認為喜歡将新項替換掉老項。
解決這個問題,你需要聲明一個key讓mapping插件使用,用來判斷一個對象是新對象還是舊對象。代碼如下:
這樣,每次map的時候,mapping插件都會檢查數組項的id屬性來判斷這個數組項是需要合并的還是全新replace的。
用create自定義對象的構造器
如果你想自己控制mapping,你也可以使用create回調。使用回調可以讓你自己控制mapping。
舉例,你有一個像這樣的JavaScript對象:
如果你想自己map children 數組,你可以這樣聲明:
支援create回調的options參數是一個JavaScript對象,包含如下:
data: JavaScript對象,包含child用到的資料
parent:child對象所屬的父對象或者數組
如果你想讓初始的JavaScript對象帶有額外的依賴屬性dependent observables:
用update自定義對象的updating
你也可以使用update 回調來自定義一個對象如何更新。它接受一個需要替代的對象以及和create 回調一樣的options參數,你應該return更新後的值。
update 回調使用的options參數是一個JavaScript對象,包含如下内容:
data:JavaScript對象,包含child用到的資料
observable:如果屬性是observable的,這将會寫入到實際的observable裡
例子,在資料顯示之前,在新資料後面附加額外的字元串:
那麼alert的結果為
