在具有子项的对象上使用Knockout映射插件

时间:2013-11-28 10:58:09

标签: 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.toJS(mappedData);

在unmappedData根对象中,age不存在,但在子对象中,它是。 这是因为映射插件会跟踪原始属性,但仅限于根对象。

除了为根目录下的每个子集合使用自定义“创建”映射之外,还有办法打开子集合对象的跟踪吗?

1 个答案:

答案 0 :(得分:2)

可能您唯一可行的选择是为每个子集合使用自定义create函数...

但您不需要手动创建可以使用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);

演示JSFiddle