2014-02-12 37 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插入一个项目 –