2013-03-21 3 views
0

이 게시물은 one의 후속 조치입니다. 다음으로녹아웃 재귀 매핑 문제

나는 코드를 업데이트했습니다

viewModel.getQuotesSuccess = function (result) { 

    var myCoverQuotesViewModel = function (data) { 
    var self = this; 
    ko.mapping.fromJS(data, {}, self); 

    self.Childs = ko.observableArray(ko.utils.arrayMap(data.Childs, function (c) { 
     return new myCoverQuotesViewModel(c); 
    })); 

    self.selectedChild = ko.observable(); 
    self.showChildren = ko.computed(function() { 
     return self.selectedChild() 
     && self.selectedChild().Childs().length > 0; 
    }); 



var mapping = { 
    'CoverQuotes': { 
     create: function (options) { 
      return new myCoverQuotesViewModel(options.data); 
     } 
    } 
} 

ko.mapping.fromJS(result, mapping, viewModel); 

};

뷰 모델이 같은 것을 보일 것이다 : 그래서 간단히 말해서

var viewModel = { 

    CoverQuotes: [{id: 1, label:'test', Childs:[{id: 2, label:'child1'}]] 
}; 

을, 나는 각 요소는 CoverQuotes (등)의 배열을 포함 CoverQuotes의 배열을 가지고있다.

이 맵핑에서의 문제점은 차일 즈 관찰 가능 어레이와 관련이 있습니다. 전화 할 때 :

return new myCoverQuotesViewModel(options.data); 

주 개체는 괜찮습니다. 그러나 arrayMap 함수 내에서 생성자를 호출하면 그 행은 다음과 같습니다.

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

아무 것도 수행하지 않습니다.

결과적으로 중첩 된 자식에는 selectedChild 및 showChildren 속성이 할당되지만 다른 모든 요소 (예 :이 예에서는 id 및 label)가 누락되었습니다.

매핑이 아이들을 위해 잘 작동하도록 나는 무엇을 놓치고 있습니까?

답변

0

나는

viewModel.getQuotesSuccess = function (result) { 
    var myCoverQuotesViewModel = function (data) { 
     var self = this; 

     var mappingChildren = { 
      'Childs': { 
       create: function (options) { 
        return new myCoverQuotesViewModel(options.data); 
       } 
      } 
     } 

     ko.mapping.fromJS(data, mappingChildren, self); 


     self.selectedChild = ko.observable(); 
     self.showChildren = ko.computed(function() { 
      return self.selectedChild() && self.selectedChild().Childs().length > 0; 
     }); 

     self.IsVisible = ko.computed({ 
      read: function() { 
       var visible = true; 
       if (self.DependsOn().length > 0) { 
        $.each(self.DependsOn(), function (index, value) { 
         var dependency = viewModel.QuoteSelectedViewModel().CoverQuotes.filterByProperty("Code", value); 
         if (dependency().length > 0) { 
          visible = visible & dependency()[0].IsSelected(); 
         } else { 
          visible = false; 
         } 
        }); 
       } 

       return visible; 
      }, 
      deferEvaluation: true 
     }, this); 
    } 

    var mapping = { 
     'CoverQuotes': { 
      create: function (options) { 
       return new myCoverQuotesViewModel(options.data); 
      } 
     } 
    } 

    ko.mapping.fromJS(result, mapping, viewModel); 
}; 
+0

당신이 당신의 VM 외부에서 mappingChildren 옵션을 배치하여 같은 목표를 달성하지 않았을 재귀 커스텀 매핑을 사용하여 내 문제를 해결했다? 실제로 mappingChildren의 'Childs'속성을 매핑에 복사하고 ko.mapping.fromJS (data, mapping, self)에 자식 매핑 지시어를 역전시킬 수 있어야합니다. 데이터에는 'Childs'속성이 포함되므로 매핑이 동일하더라도 매핑에서 'Childs'속성을 사용해야합니다. – beauXjames