如何在使用Knockout Mapping插件时扩展较低级别的对象

时间:2012-08-31 21:20:00

标签: knockout.js knockout-mapping-plugin

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

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

1 个答案:

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

updated fiddle