【问题标题】:Knockout Mapping - Customize Create with Nested ObjectsKnockout Mapping - 使用嵌套对象自定义创建
【发布时间】:2013-03-09 17:12:15
【问题描述】:

我在使用 KnockoutJS 的映射插件时遇到了问题,我需要执行以下操作:

  1. 自定义对象的映射创建
  2. 从 #1 自定义嵌套对象数组的映射创建。

在这个fiddle example 中,我正在尝试将 children 正确映射到他们的自定义创建。预期结果是每个 children 都添加了 description 属性。从小提琴,结果应该是:

  • 亚当·史密斯
  • 鲍勃 5 岁
  • 克里斯 7 岁

我可以在这个fiddle example 中演示预期的行为。请注意,在这段代码中,我必须有两个数据集,第一个有一个空的子对象数组。下面这行代码会引起子对象的自定义创建:

ko.mapping.fromJS(additionalData, parentMapping, viewModel);

不幸的是,这需要有空的初始 children 和两次映射。这是不可接受的,因为实际上代码的层次结构要深得多。

除了上述之外,我还尝试在 parentMapping 中添加以下代码:

var mapping = { 'ignore': ["children"] };
var innerModel = ko.mapping.fromJS(options.data, mapping);
//for brevity
innerModel.children = ko.mapping.fromJS(options.data.children, childMapping);

这具有将 children 对象映射到初始映射的效果。但是,children 属性的所有后续映射都会被忽略。

有没有办法使用 Knockout Mapping 自定义创建父对象和子对象?

谢谢。

【问题讨论】:

标签: knockout.js mapping


【解决方案1】:

http://jsfiddle.net/5cfa3/23/

var viewModel = {};

var data = {
  id: "1",
  firstName: 'Adam',
  lastName: "Smith",
  children: [ {id: "2", name: "Bob", age: 5}, {id: "3", name: "Chris", age: 7 }]
};

var Parent = function(data){
  ko.mapping.fromJS(data, mapping, this)
};

var mapping = {
  create:function(options){
    var parent = new Parent(options.data);
    parent.fullName = ko.computed(function(){
        return parent.firstName() + " " + parent.lastName();
    });
    return parent;
  },
  'children': {
     create: function(options) {
         options.data.description = ko.computed(function(){
             return options.data.name + " is " + options.data.age + " years old ";
         });
         return ko.mapping.fromJS(options.data);         
     }
   }
};

viewModel = ko.mapping.fromJS(data, mapping);

ko.applyBindings(viewModel);

【讨论】:

  • 谢谢。这就是我一直在寻找的。​​span>
  • 我更新了 JSFiddle:jsfiddle.net/an40fp6y Darussian 六年前发布的由于 https 问题而无法使用。
猜你喜欢
  • 2016-05-04
  • 2015-04-10
  • 2016-06-29
  • 2020-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-16
相关资源
最近更新 更多