我遇到了一个与KnockoutJS的映射插件的问题,我需要执行以下操作:
>自定义对象的映射创建
>自定义#1中嵌套对象数组的映射创建.
在这个fiddle example中,我试图让孩子们正确地映射到他们的定制创作.预期的结果是每个孩子都有附加的描述属性.从小提琴,结果应该是:
亚当·史密斯
> 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属性.
有没有办法通过Knockout Mapping自定义父对象和子对象的创建?
谢谢.
解决方法
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);