【问题标题】:Using the Knockout mapping plugin on objects with children对具有子对象的对象使用 Knockout 映射插件
【发布时间】:2013-12-14 09:07:12
【问题描述】:

假设我有这些数据:

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 根对象中,年龄不存在,但在子对象中存在。 这是因为映射插件会跟踪原始属性,但仅限于根对象。

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

【问题讨论】:

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

标签: knockout.js knockout-mapping-plugin


【解决方案1】:

可能您唯一可行的选择是为每个子集合使用自定义 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.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-03
    • 1970-01-01
    • 2017-03-06
    • 2012-03-23
    • 2013-01-09
    • 2012-06-08
    • 2019-09-19
    • 1970-01-01
    相关资源
    最近更新 更多