Knockout.js 淘汰递归映射问题
这篇文章是这篇文章的后续文章 我已按如下方式更新了代码:Knockout.js 淘汰递归映射问题,knockout.js,knockout-mapping-plugin,Knockout.js,Knockout Mapping Plugin,这篇文章是这篇文章的后续文章 我已按如下方式更新了代码: viewModel.getQuotesSuccess = function (result) { var myCoverQuotesViewModel = function (data) { var self = this; ko.mapping.fromJS(data, {}, self); self.Childs = ko.observableArray(ko.utils.arrayMap(data
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和标签)
我遗漏了什么,所以映射也适用于儿童?我使用递归自定义映射解决了我的问题
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);
};
如果将mappingChildren选项放置在VM之外,您不会达到同样的目标吗?实际上,您应该能够将mappingChildren的'Childs'属性复制到mapping,并将child-mapping指令追溯到ko.mapping.fromJS(数据、映射、self)。因为数据包含“Childs”属性,所以映射应该使用“Childs”属性,即使映射是相同的。