Knockout.js 在有子对象上使用敲除映射插件

Knockout.js 在有子对象上使用敲除映射插件,knockout.js,knockout-mapping-plugin,Knockout.js,Knockout Mapping Plugin,假设我有以下数据: var data = { name: 'Graham', children: [ { id : 1, name : 'Lisa' } ] } 现在我映射它,添加一些属性并将其映射回: var mappedData = ko.mapping.fromJS(data); mappedData.age = 44; mappedData.children[0].age = 12; var unmappedData = ko.mapping.to

假设我有以下数据:

var data = {
    name: 'Graham',
    children: [
        { id : 1, name : 'Lisa' }
   ]
}
现在我映射它,添加一些属性并将其映射回:

var mappedData = ko.mapping.fromJS(data);
mappedData.age = 44;
mappedData.children[0].age = 12;
var unmappedData = ko.mapping.toJS(mappedData);
在unmappedData根对象中,年龄不存在,但在子对象中,年龄存在。 这是因为映射插件跟踪原始属性,但只跟踪根对象


除了对根目录下的每个子集合使用自定义“创建”映射外,是否还有其他方法可以对子集合对象启用此跟踪?

可能您唯一可行的选择是对每个子集合使用自定义的
创建
函数

但您不需要手动创建映射,您可以使用
ko.mapping.visitModel
方法生成映射,例如:

var mapping = {};
ko.mapping.visitModel(data, function(item, parent) {
    if (ko.mapping.getType(item) === "array")
    {
        mapping[parent] = { 
            create: function(op) { return ko.mapping.fromJS(op.data); }
        }
    }
});
var mappedData = ko.mapping.fromJS(data, mapping);

演示。

那么您希望在
未显示的数据上显示该值。children[0]。年龄不应该是12岁?或者您希望
unmappedData.age
应该是44?在unmappedData对象中,我希望age不显示。对于根对象和子对象。那么您唯一可行的选择可能是为每个子集合使用自定义的
create
映射。。。但是您可以使用
ko.mapping.visitModel
方法生成映射配置:这正是我的意思。谢谢如果你把答案写进答案里,我会给你分数。