KO 子对象的映射问题



我从服务器获取以下数据:

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);   

我知道第一个对象具有数据类型为 Objectchild 属性。但是,第二个对象具有类型 Observable 的属性child,当它解开包装时返回 null。

我怎样才能使在这两种情况下对象具有相同的类型,即使一个具有值而另一个为空。更改服务器的行为方式不是一种选择。我希望有Objectnull或两者兼而有之Observables.

JsFiddle 在这里。

您需要

使用 create 选项告诉映射插件它应该如何映射您的child属性。

因此,如果您想拥有Objectnull,则需要在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();
        }
    }
}

最新更新