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为null值 ,然后返回空ko.observable(),否则绑定会遇到很多麻烦! 我花了很多时间找到这个问题。

var mappingOptions = {
    child: {
        create: function (options) {
            return options.data != null ? ko.observable(ko.mapping.fromJS(options.data)) : ko.observable();
        }
    }
}
链接地址: http://www.djcxy.com/p/74129.html

上一篇: KO Mapping issue with child objects

下一篇: Specify delay loading dll with #pragma in the cpp file