2

我想將此json映射到自定義對象。 問題是項目不是typeof Item對象,而是普通對象。 我在這裏錯過了什麼?knockoutjs使用嵌套數組映射自定義對象

您可以測試在這裏:http://jsfiddle.net/5jhpE/

var json = [ 
    { 
     id: 1, 
     items: [ 
      {id: 1, name: 'item1'}, 
      {id: 2, name: 'item2'}, 
      {id: 3, name: 'item3'} 
     ] 
    }, 
    { 
     id: 2, 
     items: [ 
      {id: 4, name: 'item4'}, 
      {id: 5, name: 'item5'}, 
      {id: 6, name: 'item6'} 
     ] 
    }, 
] 

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

function Item(data) { 
    ko.mapping.fromJS(data, {}, this); 
} 
var map = { 
    create: function(options) { 
     return new Data(options.data); 
    }, 
    items: function(options) { 
     return new Item(options.data); 
    }, 
} 

var res = ko.mapping.fromJS(json, map); 

輸出:

console.log(res()); 
[Data, Data] 
-- 
console.log(res()[0].items()); 
[Object, Object, Object] <-- Here I want to have [Item, Item, Item] 

回答

5

我已經改變了你的映射器選擇以這種方式

var map = { 
    'items': { 
     create: function(options) { 
      return new Item(options.data); 
     } 
    } 
} 

,似乎罰款; 你可以試試嗎?

如果您需要:jsfiddle 控制檯輸出[項目,項目,項目]只要你想;


我允許添加一個小建議:如果你需要測試的typeof這樣:

typeof res()[0].items()[0] 

講究,它可能會非常棘手!

爲了避免任何問題,我通常申報項目視圖模型以這樣的方式

function Item(data) { 
    var self = this; 
    self.myType = 'item'; 
    ko.mapping.fromJS(data, {}, this); 
} 

所以你可以簡單的測試,例如:

if('item' === res()[0].items()[0].myType) { 
    //do something... 
} 

此「的myType」訣竅是建議前段時間在這裏的stackoverflow:我會盡快發佈鏈接

+0

是的,完美:KodeKreachor在他的帖子中找到了鏈接 –

+0

doh !! Tnx很多隊友!我非常疲倦,我錯過了「創造」 – Oden