8

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

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

我知道第一个对象具有数据child类型的属性Object。然而,第二个对象有一个child类型的属性Observable,当它展开时返回 null。

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

JsFiddle在这里

4

2 回答 2

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

演示JSFiddle

或者如果你想要他们两个Observables

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

ko.mapping.fromJS(data, mappingOptions, viewModel.data);   
于 2013-09-06T09:49:32.423 回答
0

如前所述,解决方案是映射选项,但请确保始终测试 options.data 的 null 值,然后返回空的 ko.observable(),否则绑定会有很多麻烦!我花了很多时间来找到它。

var mappingOptions = {
    child: {
        create: function (options) {
            return options.data != null ? ko.observable(ko.mapping.fromJS(options.data)) : ko.observable();
        }
    }
}
于 2016-09-07T21:05:42.133 回答