KO映射问题与子对象

mar*_*bit 8 knockout-mapping-plugin knockout.js

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

var data =   [{ id: 0, child: { prop1 : 'a', prop2 : 'b' } }   //Child object has data
             ,{ id: 0, child: null } ];    // Child object is null
Run Code Online (Sandbox Code Playgroud)

在使用knockout mapping插件映射数据后,我遇到了一些问题.问题是内部child对象的类型不同.

执行后:

ko.mapping.fromJS(data, viewModel.data);   
Run Code Online (Sandbox Code Playgroud)

我得到第一个对象具有带数据child的类型属性Object.但是,第二个对象具有child类型的属性Observable,当它被解包时返回null.

如何在两种情况下都使对象具有相同的类型,即使一个具有值,另一个为null.无法更改服务器的行为方式.我希望有Objectnull或两者Observables.

JsFiddle 在这里.

nem*_*esv 4

您需要使用该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);  
Run Code Online (Sandbox Code Playgroud)

演示JSFiddle

或者如果你两者都想要Observables

var mappingOptions = {
    child: {
        create: function(options) {
            return ko.observable(ko.mapping.fromJS(options.data));
        }
    }
}

ko.mapping.fromJS(data, mappingOptions, viewModel.data);   
Run Code Online (Sandbox Code Playgroud)