2014-02-12 63 views
12

我遇到了問題,我的表列和行都需要動態綁定才能工作。表列和行的動態綁定

假設我有兩個型號,一個拿着表格列信息:

var aColumnData = [ 
     { 
      columnId : "col1" 
     }, 
     { 
      columnId : "col2" 
     }, 
     { 
      columnId : "col3" 
     }, 
     { 
      columnId : "col4" 
     }, 
     { 
      columnId : "col5" 
     } 
    ]; 

和一個與數據:

var aData = [ 
    { 
     col1 : "Row 1 col 1", 
     col2 : "Row 1 col 2", 
     col3 : "Row 1 col 3", 
     col4 : "Row 1 col 4", 
     col5 : "Row 1 col 5" 
    }, 
    { 
     col1 : "Row 2 col 1", 
     col2 : "Row 2 col 2", 
     col3 : "Row 2 col 3", 
     col4 : "Row 2 col 4", 
     col5 : "Row 2 col 5" 
    } 
]; 

我然後設置模式:

var oModel = new sap.ui.model.json.JSONModel(); 
    oModel.setData({ 
     columns : aColumnData, 
     rows : aData 
    }); 

然後我在視圖中創建我的桌子:

var oTable = new sap.ui.table.Table(); 

    var oColumnTemplate = new sap.ui.table.Column({ 
     label : "{columnDesc}", 
     template : new sap.ui.commons.TextView().bindProperty("text", "<this_should_be_dynamic_but_how?>") 
    }); 

    oTable.bindColumns("/columns", oColumnTemplate); 
    oTable.bindRows("/rows"); 

錯誤的部分是綁定到TextView模板中的當前列;這應該是動態的(「col1」,「col2」等),並在飛行中完成 - 這是什麼綁定是無論如何,我假設 - 但我不能讓它工作...

我猜我錯過了簡單而平凡的事情,但我現在有點失落... 任何幫助,高度讚賞!

==============================

編輯:我得到了它通過迭代的工作列陣列,通過addColumn()方法:

jQuery.each(aColumnData, function(i, v) { 
     oTable.addColumn(new sap.ui.table.Column({ 
      label : v.columnDesc, 
      template: new sap.ui.commons.TextView().bindProperty("text", v.columnId) 
     })); 
    }); 

...但我希望會有使用bindColumns()/ bindRows一個更簡潔的方法()方法:

回答

17

我在using factory functions看到0之前做了類似的事情類似的例子,你

var oTable = new sap.ui.table.Table({ 
    title: "Table column and data binding", 
    showNoData : true, 
    columnHeaderHeight : 10, 
    visibleRowCount: 7 
}); 
oTable.setModel(oModel); 
oTable.bindColumns("/columns", function(sId, oContext) { 
    var sColumnId = oContext.getObject().columnId; 
    return new sap.ui.table.Column({ 
     id : sColumnId, 
     label: sColumnId, 
     template: sColumnId, 
     sortProperty: sColumnId, 
     filterProperty: sColumnId 
    }); 
}); 
oTable.bindRows("/rows"); 

你可以使用2個全局命名的車型在這種情況下,一個用於元數據生成一個用於數據 如

sap.ui.getCore().setModel(oMetaModel, 'meta'); 
sap.ui.getCore().setModel(oDataModel, 'data'); 
.. 
oTable.bindColumns("meta>/columns" function... 
oTable.bindRows("data>/rows"); 

這裏有一個例子jsbin example of dynamic columns based on OData metadata

+2

優秀@ Jasper_07,就像一個魅力!你是一個真正的生活**和**倍速! :-) – Qualiture

+0

是否也可以修改一個textview模板中的單個行和所有其他鏈接模板中的行? – zyrex

+1

@zyrex是的,你可以在綁定模板和數據後,使用oTable.insertRow(oRow,iIndex)在索引0插入一個項目 –