Агрегирование привязки относительно выбора родителей
У меня есть представление XML и контроллер.
Данные моей модели привязаны к sap.m.Table
, Проблема в том, что я должен связать "items"
относительно определенного элемента массива моей модели.
Это мои данные модели:
[{
"type": "01",
"items": [{
"date": "20150720",
"amount": 53.20,
"paytype": "Cash"
}, {
"date": "20150720",
"amount": 23.20,
"paytype": "Cash"
}]
}, {
"type": "02",
"items": [{
"date": "20150720",
"amount": 515.6,
"paytype": "Credit Card"
}, {
"date": "20150720",
"amount": 3,
"paytype": "Something else"
}]
}]
Я хочу привязать свой стол к "items"
собственность в соответствии с изменением выбора моего Select
элемент управления, имеющий такие поля, как свойство type, привязанное.
Как я могу записать путь свойства items в моей таблице? "data>/items/"
не работал
Я думал о решении связать значение пути с внешней модельюpathModel
и обновить его свойство в соответствии с изменением выбора объекта select следующим образом:
Мой взгляд:
<Table
id="dataTable"
items="{path>pathUrl}"
>
Мой контроллер:
newPath = "data>/"+ countPath +"/items/";
currentView.getModel("path").setProperty("/pathUrl", newPath);
Но это тоже не работает.
4 ответа
Мое решение, и я думаю, что оно лучшее: создать независимую модель для таблицы и заполнить ее элементами моей первой модели при изменении элемента управления select.
Это мой код:
var itemsTable = currentView.getModel( "AdjustData" ); // this is my new mode bound to the table
var data = currentView.getModel( "data" ).getData();
// Set Type payment items
jQuery.each( data , function( index , item ) {
if ( item.type == mode ) {
itemsTable.setData( item.items );
}
});
Вопрос описывает типичный вариант использования концепции связывания элементов.
Посмотреть
<Select
forceSelection="false"
change=".onSelectionChange"
items="{myModel>/}"
>
<core:Item
key="{myModel>typeKey}"
text="Type {myModel>type}"
/>
</Select>
<Table id="myTable" items="{myModel>items}">
<items>
<ColumnListItem>
<Text text="{myModel>paytype}"/>
<Text text="{myModel>amount}"/>
</ColumnListItem>
</items>
<!-- ... -->
</Table>
контроллер
onSelectionChange: function(event) {
const selectedItem = event.getParameter("selectedItem");
this.byId("myTable").bindElement({
path: selectedItem.getBindingContext("myModel").getPath(), // e.g. "/1"
model: "myModel",
});
},
Как только элемент выбран из Select
контроль, onSelectionChange
вызывается с выбранным элементом в качестве параметра. Этот элемент содержит APIконтекста привязки, который можно получить с помощью .getBindingContext(/*modelName*/)
, призвание getPath()
из него вернется абсолютный путь связанных данных. В случае JSONModel путь будет похож на индекс, такой как "/0"
, "/1"
и т. д. В случае ODataModel; "/ProductSet('123')"
например.
Абсолютный путь привязки должен быть назначен API bindElement
, API Все относительные пути привязки внутри целевого элемента, например "{myModel>items}"
, может быть окончательно решен, показывая данные в пользовательский интерфейс.
Вот рабочий пример использования ваших данных: https://embed.plnkr.co/FOEY1JZIKFAJTApe?show=controller/Home.controller.js,preview.
Я создал простой пример Plunker, который показывает простой способ достичь того, что вы ищете. Проверьте это здесь.
onSelectChange: function (ev) {
var list = this.getView().byId("myList");
var index = ev.getParameter("selectedItem").getKey();
list.bindItems("/" + index + "/items",
new sap.m.StandardListItem({
title: "{amount}",
description: "{paytype}"
})
);
}
Существует элемент управления sap.m.Select с обработчиком изменений, в котором мы привязываем таблицу к соответствующему массиву элементов.
Можете ли вы попробовать это:
<Table id="myTable"
items="{
path: 'data>/items'
}">