天天看點

Knockout.Js官網學習(Mapping進階用法二)

使用ignore忽略不需要map的屬性

如果在map的時候,你想忽略一些屬性,你可以使用ignore累聲明需要忽略的屬性名稱集合:

var data = {"name":"aehyok","age":"25" };
    var mapping = { 'ignore': ["age"] };
    var viewModel = ko.mapping.fromJS(data, mapping);      

這樣執行後age不會在viewModel中

Knockout.Js官網學習(Mapping進階用法二)

你聲明的忽略數組被編譯到預設的ignore數組裡。你可以像下面代碼一樣來維護它:

var oldOptions = ko.mapping.defaultOptions().ignore;
    ko.mapping.defaultOptions().ignore = ["alwaysIgnoreThis"];      

使用include聲明需要map的屬性

預設情況下,當map你的view model回到JS對象是時候,隻map原始view model裡擁有的屬性(除了例外的_destroy屬性),不過,你可以使用include參數來定制:

var mapping = {    'include': ["propertyToInclude", "alsoIncludeThis"]};

var viewModel = ko.mapping.fromJS(data, mapping);      

你聲明的include數組被編譯到預設的include數組裡,預設隻有_destroy。 你可以像這樣來維護:

var oldOptions = ko.mapping.defaultOptions().include;

ko.mapping.defaultOptions().include = ["alwaysIncludeThis"];      

使用copy來複制屬性

預設情況下,map的時候是把所有的值都轉換成observable的,如果你隻是想copy屬性值而不是替換成observable的,你可以将屬性名稱添加到copy數組:

var mapping = {    'copy': ["propertyToCopy"]};

var viewModel = ko.mapping.fromJS(data, mapping);      

你聲明的copy數組被編譯到預設的copy數組裡,預設值是空。你可以像這樣來維護

var oldOptions = ko.mapping.defaultOptions().copy;
ko.mapping.defaultOptions().copy = ["alwaysCopyThis"];      

Specifying the update target

在上面的例子,如果你想再一個class内map,你可以使用第三個參數作為操作的目标,例如:

ko.mapping.fromJS(data, {}, someObject);       

是以,如果你想map一個JavaScript對象到this上,你可以這樣聲明:

ko.mapping.fromJS(data, {}, this);      

從資料源map

你可以通過多次使用ko.mapping.fromJS 來将多個JS對象的資料源map到一起,例如:

var viewModel = ko.mapping.fromJS(alice, aliceMappingOptions);

ko.mapping.fromJS(bob, bobMappingOptions, viewModel);      

Map以後的observable數組

map插件map以後生産的observable數組,帶有幾個額外的函數來處理帶有keys的mapping:

mappedRemove
mappedRemoveAll
mappedDestroy
mappedDestroyAll
mappedIndexOf      

它們是和ko.observableArray裡的函數等價的,不同是他們通過key來處理對象。例如:

var obj = [{ id: 1 }, { id: 2 }];
    var result = ko.mapping.fromJS(obj, { key: function (item) { return ko.utils.unwrapObservable(item.id); } });
    result.mappedRemove({ id: 2 });      

map過的observable數組,除了上面的函數還支援一個mappedCreate函數:

var newItem = result.mappedCreate({ id: 3 });      

首先會檢查key(id=3)在數組裡是否存在(如果存在則抛出異常),然後,如果有create和 update回調的話會調用他們,最後建立一個新對象,并将新對象添加到數組然後傳回該新對象。

繼續閱讀