我遇到了 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);
(这是我可以为此做的一个小回购。这里提供小提琴: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);?
但是,parent
传递给 InnerModel 的是null
,这就是我追求映射插件的全部原因。文档让我相信这应该被传递options
给函数的参数create
,但是我得到了一个observable
其值为null
. 在这个方向上还有什么额外的指示吗?