2013-07-03 24 views
7

我想輸出一個基於ko.observableArray的數據表,其中返回的列不是預先確定的。從ko.observableArray動態設置表列

一個項目從我observableArray self.userData()[0]的樣本是:基於什麼用戶選擇輸出每次

Object { 
     RowNum: 1, 
     ID: "123", 
     Surname: "Bloggs", 
     Forename: "Joe", 
     Address line 1: "1 Park Lane" 
} 

這些列會有所不同。

我想在我的輸出列標題由什麼是數組中存在的決定,所以我期望的輸出將是:

<table> 
    <thead> 
     <tr> 
     <th>RowNum</th> 
     <th>ID</th> 
     <th>Surname</th> 
     <th>Forename</th> 
     <th>Address line 1</th> 
     </tr> 
    </thead> 
    <tbody> 
     <tr> 
     <td>1</td> 
     <td>123</td> 
     <td>Bloggs</td> 
     <td>Joe</td> 
     <td>1 Park Lane</td> 
     </tr> 
     <!-- repeated for each row --> 
    </tbody> 
</table> 

我知道我可以使用foreach重複的行和列,但我我不確定如何根據我的observableArray中的內容動態地引用它。

目前,我有這樣的基本結構:

<table> 
    <thead> 
     <tr data-bind="foreach: userData [property name] "> 
      <th> 
       <span data-bind="text: [property name]"></span> 
      </th>     
     </tr> 
    </thead> 
    <tbody data-bind="foreach: userData">     
     <tr data-bind="foreach: userData [property name]> 
      <td data-bind="text: [property value]">        
      </td>       
     </tr> 
    </tbody> 
</table> 
+1

我可以問你爲什麼不使用KoGrid? – Anders

+0

@Anders相當新的淘汰賽,但我現在看看它,謝謝。 – Tanner

回答

15

你可以這樣做:

JS:

var VM = function() { 
    var self = this; 
    self.items = ko.observableArray(); 
    self.columnNames = ko.computed(function() { 
     if (self.items().length === 0) 
      return []; 
     var props = []; 
     var obj = self.items()[0]; 
     for (var name in obj) 
      props.push(name); 
     return props; 


    }); 

}; 
var vm = new VM(); 

ko.applyBindings(vm); 

vm.items.push({ 
    'Name': 'John', 
    'Age': 25 
}); 
vm.items.push({ 
    'Name': 'Morgan', 
    'Age': 26 
}); 

查看:

<table> 
    <thead> 
     <tr data-bind="foreach: columnNames"> 
      <th> <span data-bind="text: $data"></span> 

      </th> 
     </tr> 
    </thead> 
    <tbody data-bind="foreach: items"> 
     <tr data-bind="foreach: $parent.columnNames"> 
      <td data-bind="text: $parent[$data]"></td> 
     </tr> 
    </tbody> 
</table> 

See fiddle

我希望它有幫助。

+0

謝謝@Damien,這正是我需要的 – Tanner

+0

嗨達米安,這對我很好,但我還需要添加一個過濾器行,它將有文本輸入,這些將需要綁定到我的視圖模型,以便當我刷新它將會收集所有應用過濾器的數據。我嘗試了一些東西,但不能得到它的工作,任何想法? – Mingo

+0

@Mingo,你應該創建一個問題,不要忘記添加你嘗試:) – Damien