Mat*_*ker 6 knockout-mapping-plugin knockout.js
我遇到了knockout.js的问题,并且映射插件没有为源数据中的子数组创建模型
var data = {
outer: [
{
'id': 1,
name: 'test outer',
inner: [{
'id': 1,
name: 'test inner'}]}]
};
function OuterModel(data) {
var self = this;
ko.mapping.fromJS(data, {}, this);
self.fullText = ko.computed(function() {
return self.id() + ". " + self.name();
});
}
function InnerModel(data, parent) {
var self = this;
ko.mapping.fromJS(data, {}, this);
self.fullText = ko.computed(function() {
return self.id() + ". " + self.name() + "(" + parent + ")";
});
}
function PageModel() {
var self = this;
this.data = null;
}
var mapping = {
'outer': {
key: function(data) {
return ko.utils.unwrapObservable(data.id);
},
create: function(options) {
var thisModel = new OuterModel(options.data);
return thisModel;
}
},
'inner': {
key: function(data) {
return ko.utils.unwrapObservable(data.id);
},
create: function(options) {
var thisModel = new InnerModel(options.data);
return thisModel;
}
}
};
var model = new PageModel();
model.data = ko.mapping.fromJS(data, mapping);
Run Code Online (Sandbox Code Playgroud)
(这是我可以为此做的一个小型回购.这里提供小提琴:http://jsfiddle.net/msieker/6Wx3s/)
简而言之,永远不会调用InnerModel构造函数.我已尝试使用'InnerModel'此片段中的两者以及'inner'映射中的内容.从我所看到的大多数情况来看,这应该可行,但显然我错过了一些东西.
任何人都有这方面的经验可以指出我正确的方向?
编辑: 根据@John Earles的回答,我已经把它更接近我需要的东西了:
var data = {
outer: [
{
'id': 1,
name: 'test outer',
inner: [{
'id': 1,
name: 'test inner'}]}]
};
var outerMapping = {
'outer': {
key: function(data) {
return ko.utils.unwrapObservable(data.id);
},
create: function(options) {
var thisModel = new OuterModel(options.data);
return thisModel;
}
}
};
function OuterModel(data) {
var self = this;
ko.mapping.fromJS(data, innerMapping, this);
self.fullText = ko.computed(function() {
return self.id() + ". " + self.name();
});
}
var innerMapping = {
'inner': {
key: function(data) {
return ko.utils.unwrapObservable(data.id);
},
create: function(options) {
console.log(options);
var thisModel = new InnerModel(options.data, options.parent());
return thisModel;
}
}
};
function InnerModel(data, parent) {
var self = this;
ko.mapping.fromJS(data, {}, this);
self.fullText = ko.computed(function() {
return self.id() + ". " + self.name() + "(" + parent + ")";
});
}
function PageModel() {
var self = this;
this.data = null;
}
var model = new PageModel();
model.data = ko.mapping.fromJS(data, outerMapping);
ko.applyBindings(model);?
Run Code Online (Sandbox Code Playgroud)
然而,parent传递给InnerModel的是null,这就是我追求映射插件的全部原因.文档让我相信这应该是将options参数传递给create函数,但我得到的是observable其值null.还有这方面的其他指示?
您没有将映射选项(定义如何映射内部)传递到 OuterModel 映射调用中。
function OuterModel(data) {
var self = this;
ko.mapping.fromJS(data, mapping, this);
self.fullText = ko.computed(function() {
return self.id() + ". " + self.name();
});
}
Run Code Online (Sandbox Code Playgroud)
编辑:更新了小提琴以显示父级的手动附件:
http://jsfiddle.net/jearles/6Wx3s/5/