2013-03-21 93 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(依此类推)的数组。

我在这个映射中遇到的问题是使用Childs可观察数组。当拨打电话:

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

你岂不放置你的mappingChildren选择你的虚拟机之外实现同样的目标解决我的问题?实际上,您应该能够将mappingChildren的'Childs'属性复制到映射中,并将子映射指令复制到ko.mapping.fromJS(data,mapping,self)。由于数据包含'Childs'属性,映射应该使用'Childs'属性,即使映射是相同的。 – beauXjames 2013-11-01 21:19:47