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を作成しました。その例では、コメント付きの addRowFirst リンクを HTML で有効にしようとしています。

4

1 に答える 1

2

行うマッピングごとに、渡すマッピングオブジェクト(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 に答える