如果我有多级数据,例如:
{"tabs": [
"rows": [{
"id": 200,
"name": "B"},
{
"id": 300,
"name": "C"}]},...
据我所知,我可以使用以下代码扩展标签:
var myTabExtensions = function(data) {
ko.mapping.fromJS(data, {}, this);
this.addRow = function() {
var rowID = this.rows().length + 1;
this.rows.push(new Row(rowID, 'row ' + rowID));
}.bind(this);
};
var mapping = {
'tabs': {
key: function(data) {
return data.id;
},
create: function(options) {
return new myTabExtensions(options.data);
}
}
};
var viewModel = ko.mapping.fromJS(data, mapping);
...但是如何扩展每一行(不在根目录下)?
我创建了一个jsFiddle,其中包含更多细节。在该示例中,我正在尝试在HTML中启用注释的addRowFirst链接。
答案 0 :(得分:2)
对于您执行的每个映射,您传入的映射对象(第二个参数)仅适用于第一个参数中的对象。对于嵌套映射,您需要提供一个新的映射对象。
由于您的myTabModel
正在尝试映射与选项卡关联的数据,因此它将使用映射对象来提供映射。因为它是空的,所以它不处理你的行。将rows
映射移到那里。
var myTabModel = function(data) {
// use this mapping object to map our tab
var mapping = {
'rows': {
key: function(data) {
return data.id;
},
create: function(options) {
return new myRowModel(options.data);
}
}
};
ko.mapping.fromJS(data, mapping, this);
this.addRow = function() {
var rowID = this.rows().length + 1;
this.rows.push(new Row(rowID, 'row ' + rowID));
}.bind(this);
};