2012-08-31 91 views
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鏈接。

+0

出於某種原因,你的小提琴是不是爲我工作。映射插件未正確加載。 –

+0

試試這個版本:http://jsfiddle.net/fqFxZ/8/ – Joe

回答

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

+0

對不起,我的解釋措辭很差,希望這個例子能夠解釋它自己。 –

+0

太棒了,謝謝。代碼是有道理的。我已經把一個稍微更新的小提琴放在:http://jsfiddle.net/fqFxZ/11/ (任何剩餘的問題都與我的代碼) – Joe