Knockout Mapping - 使用嵌套对象自定义创建

时间:2013-03-20 14:30:59

标签: knockout.js mapping

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

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

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

    • 亚当·史密斯
    • Bob已经5岁了
    • Chris已经7岁了

    我可以在此fiddle example中演示预期的行为。请注意,在此代码中,我必须有两个数据集,第一个具有一个空数组的子对象。以下代码行将导致自定义创建子对象:

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

    不幸的是,这需要两个空的初始孩子和两次映射。这是不可接受的,因为现实中的代码具有更深层次的层次结构。

    除了上述内容之外,我还尝试在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自定义父对象和子对象的创建?

    谢谢。

1 个答案:

答案 0 :(得分:17)

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);