1

如果我有多级数据,例如:

{"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 链接。

4

1 回答 1

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

更新的小提琴

于 2012-09-01T01:34:34.413 回答