Динамическое связывание столбцов и строк таблицы
У меня возникают проблемы с динамической привязкой как к моим столбцам, так и к строкам таблицы.
Предположим, что у меня две модели, одна из которых содержит информацию о столбце таблицы:
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" и т.д.) и выполняться "на лету" - то, что привязки для любого случая я предполагаю, но я не могу заставить его работать...
Я думаю, что мне не хватает чего-то простого и тривиального, но сейчас я немного потерял...
Любая помощь очень ценится!
==============================
EDIT: я получил его для работы путем итерации через массив столбцов и использования метода 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():
Ответы
Ответ 1
Я сделал что-то подобное перед с помощью factory функций, см. пример jsbin для аналогичного примера для вашего
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 пример динамических столбцов на основе метаданных OData