Подтвердить что ты не робот

Динамическое связывание столбцов и строк таблицы

У меня возникают проблемы с динамической привязкой как к моим столбцам, так и к строкам таблицы.

Предположим, что у меня две модели, одна из которых содержит информацию о столбце таблицы:

    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():

4b9b3361

Ответ 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