我从服务器获取以下数据:
var data = [{ id: 0, child: { prop1 : 'a', prop2 : 'b' } } //Child object has data
,{ id: 0, child: null } ]; // Child object is null
使用挖空映射插件映射数据后,我遇到了一些问题。问题是内部child
对象不属于同一类型。
执行此操作后:
ko.mapping.fromJS(data, viewModel.data);
我知道第一个对象具有数据类型为 Object
的 child
属性。但是,第二个对象具有类型 Observable
的属性child
,当它解开包装时返回 null。
我怎样才能使在这两种情况下对象具有相同的类型,即使一个具有值而另一个为空。更改服务器的行为方式不是一种选择。我希望有Object
和null
或两者兼而有之Observables
.
JsFiddle 在这里。
使用 create
选项告诉映射插件它应该如何映射您的child
属性。
因此,如果您想拥有Object
和null
,则需要在null
子财产时返回null
:
var mappingOptions = {
child: {
create: function(options) {
if (!options.data)
return null;
return ko.mapping.fromJS(options.data);
}
}
}
ko.mapping.fromJS(data, mappingOptions, viewModel.data);
演示 JSFiddle。
或者,如果您希望它们都Observables
:
var mappingOptions = {
child: {
create: function(options) {
return ko.observable(ko.mapping.fromJS(options.data));
}
}
}
ko.mapping.fromJS(data, mappingOptions, viewModel.data);
如前所述,解决方案是映射选项,但请确保始终测试 options.data 的空值,然后返回空的 ko.observable(),否则您将在绑定时遇到很多麻烦!我花了很多时间来寻找它。
var mappingOptions = {
child: {
create: function (options) {
return options.data != null ? ko.observable(ko.mapping.fromJS(options.data)) : ko.observable();
}
}
}