这篇文章是这篇文章的后续。
我已更新代码如下:
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);
};
viewModel 看起来像这样:
var viewModel = {
CoverQuotes: [{id: 1, label:'test', Childs:[{id: 2, label:'child1'}]]
};
所以简而言之,我有一个 CoverQuotes 数组,其中每个元素还包含一个 CoverQuotes 数组(等等)。
这个映射的问题在于 Childs 可观察数组。调用时:
return new myCoverQuotesViewModel(options.data);
对于主要对象,它工作正常。但是,当从 th arrayMap 函数中调用构造函数时,则该行:
ko.mapping.fromJS(data, {}, self);
不做任何事情。
结果,嵌套子级被分配了属性 selectedChild 和 showChildren,但它们缺少所有其他属性(如本例中的 id 和 label )。
我错过了什么,所以映射也适用于儿童?