2

이 json을 사용자 정의 객체에 매핑하려고합니다. 문제는 항목이 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); 
} 

그래서 당신은 단순히 테스트, 예를 들어 수

이 "MYTYPE"트릭이었다
if('item' === res()[0].items()[0].myType) { 
    //do something... 
} 

시사 여기에 stackoverflow 시간이 좀 전에 : 나는 곧 게시물을 찾을거야 여기에 링크를 게시합니다

+0

예, 완벽 : KodeKreachor가 자신의 게시물에있는 링크를 발견했습니다. –

+0

doh !! Tnx 많은 친구! 나는 매우 피곤했고 나는'창조하다 ' – Oden