SAP UI5. Про объявление модели, oData сервиса в manifest.json и XML View
SAP UI5. Про объявление модели, oData сервиса в manifest.json, и варианты работы с данными модели в XML View
В прошлых заметках по теме SAPUI5 я чаще всего использовал довольно-таки криповые методы объявления модели и oData сервисов в демонстрационных приложениях. В этой заметке я хотел бы рассмотреть иные, если можно так выразиться, более правильные приемы работы с упомянутыми сущностями.
Пример 1.
Объявление oData сервиса в manifest.json (1)
Объявить oData сервис, который будет использоваться в приложении, можно посредством внесения корректировок в manifest.json
См. Descriptor (manifest.json)
См. Descriptor for Applications, Components, and Libraries
Например,
"dataSources": {
"backend": {
"uri": "/sap/opu/odata/sap/ZREACT_APP_SRV/",
"type": "OData",
"settings": {
"odataVersion": "2.0"
}
}
}
Объявление модели в manifest.json (2)
В дополнение к проинициализированному выше oData сервису, для вновь создаваемого SAP UI5 приложения понадобится модель данных. Объявить ее можно также в manifest.json
См. Models
Например,
employee": {
"dataSource": "backend",
"type": "sap.ui.model.odata.v2.ODataModel"
}
N.B. Обратите внимание на тип объявленной модели (атрибут type)
См. class sap.ui.model.odata.v2.ODataModel
Итоговый вариант manifest.json в части внесенных исправлений будет выглядеть следующим образом:
Используем manifest.json для наполнения данными View приложения (3)
После того, как были объявлены oData сервис и сопутствующая ему модель данных, в SAPUI5 приложении нужно внести корректировки в View, где будут отражаться данные, возвращаемые oData сервисом.
<mvc:View controllerName="com_zapplication99.controller.Table" xmlns:html="http://www.w3.org/1999/xhtml" xmlns:mvc="sap.ui.core.mvc"
displayBlock="true" xmlns="sap.m">
<App>
<pages>
<Page>
<content>
<Table id="idEmployeesTable" inset="false" fixedLayout="Strict" alternateRowColors="true" items="{path: \'employee>/employeeSet\'}">
<headerToolbar>
<OverflowToolbar>
<Title text="{i18n>title}" level="H2"/>
</OverflowToolbar>
</headerToolbar>
<columns>
<Column >
<Text text="Personnel Number"/>
</Column>
<Column >
<Text text="Name of Employee"/>
</Column>
<Column minScreenWidth="Tablet">
<Text text="EMail"/>
</Column>
</columns>
<items>
<ColumnListItem>
<cells>
<ObjectIdentifier text="{employee>id}"/>
<Text text="{employee>name}"/>
<Text text="{employee>email}"/>
</cells>
</ColumnListItem>
</items>
</Table>
</content>
</Page>
</pages>
</App>
</mvc:View>
Пожалуйста, обратите свое внимание на то, что в представлении (View) указана модель, и соответствующий entitySet, который позволяет получить данные для используемого контрола. Отличительной особенностью данного подхода является то, что вся модель биндится на контрол. В результате выполнения этого биндинга, фреймворк самостоятельно выполняет обращение к oData сервису и указанному entitySet'у для получения и размещения в нем данных.
Проверяю, что получилось
Пример 2
Объявление oData сервиса в в manifest.json (1)
Для того, чтобы попробовать альтернативный подход по заявленной теме, мне потребуется зарегистрировать новый источник данных, которым выступит локально созданный JSON файл.
Он же в структуре проекта:
Объявление модели в manifest.json (2)
Определяю модель данных в manifest.json
N.B. Обратите внимание на тип объявленной модели (атрибут type)
См. class sap.ui.model.json.JSONModel
Получение данных для размещения в View приложения (3)
В этом примере не получится обойтись только настройками из manifest.json. Придется немного поработать с контроллером. Например,
var oModel = this.getOwnerComponent().getModel("employee");
var oModel2 = this.getOwnerComponent().getModel("localJSON");
oModel.read("/employeeSet", {
success: function(oData, response) {
oModel2.setProperty("/employeeData", oData.results);
}
}
См. Controller
См. class sap.ui.model.json.JSONModel (setProperty)
Внесу корректировки в View приложения
<mvc:View controllerName="com_zapplication99.controller.Table" xmlns:html="http://www.w3.org/1999/xhtml" xmlns:mvc="sap.ui.core.mvc"
displayBlock="true" xmlns="sap.m">
<App>
<pages>
<Page>
<content>
<Table id="idEmployeesTable" inset="false" fixedLayout="Strict" alternateRowColors="true" items="{path: \'localJSON>/employeeData\'}">
<headerToolbar>
<OverflowToolbar>
<Title text="{i18n>title}" level="H2"/>
</OverflowToolbar>
</headerToolbar>
<columns>
<Column >
<Text text="Personnel Number"/>
</Column>
<Column >
<Text text="Name of Employee"/>
</Column>
<Column minScreenWidth="Tablet">
<Text text="EMail"/>
</Column>
</columns>
<items>
<ColumnListItem>
<cells>
<ObjectIdentifier text="{localJSON>id}"/>
<Text text="{localJSON>name}"/>
<Text text="{localJSON>email}"/>
</cells>
</ColumnListItem>
</items>
</Table>
</content>
</Page>
</pages>
</App>
</mvc:View>
Проверяю, что получилось
В противовес варианту, рассмотренному в примере #1, важно отметить, что при использовании этого подхода, у разработчика/консультанта появляется больше возможностей для манипуляции с данными в модели, которая впоследствии также будет забиндена на какой-то из контролов приложения.
См. class sap.ui.model.json.JSONModel (setProperty)
Немного скорректирую исходный код контроллера
onAfterRendering: function() {
var oModel = this.getOwnerComponent().getModel("employee");
var oModel2 = this.getOwnerComponent().getModel("localJSON");
oModel.read("/employeeSet", {
success: function(oData, response) {
oModel2.setProperty("/employeeData", oData.results);
oModel2.setProperty("/myProperty", "signatov.com");
}
}
);
}
А также добавляю вывод нового свойства в View приложения.
<mvc:View controllerName="com_zapplication99.controller.Table" xmlns:html="http://www.w3.org/1999/xhtml" xmlns:mvc="sap.ui.core.mvc"
displayBlock="true" xmlns="sap.m">
<App>
<pages>
<Page>
<content>
<Table id="idEmployeesTable" inset="false" fixedLayout="Strict" alternateRowColors="true" items="{path: \'localJSON>/employeeData\'}">
<headerToolbar>
<OverflowToolbar>
<Title text="{i18n>title}" level="H2"/>
<Title text="with love from {localJSON>/myProperty}" level="H2"/>
</OverflowToolbar>
</headerToolbar>
<columns>
<Column >
<Text text="Personnel Number"/>
</Column>
<Column >
<Text text="Name of Employee"/>
</Column>
<Column minScreenWidth="Tablet">
<Text text="EMail"/>
</Column>
</columns>
<items>
<ColumnListItem>
<cells>
<ObjectIdentifier text="{localJSON>id}"/>
<Text text="{localJSON>name}"/>
<Text text="{localJSON>email}"/>
</cells>
</ColumnListItem>
</items>
</Table>
</content>
</Page>
</pages>
</App>
</mvc:View>
Проверяю
P.S.
За помощь и консультацию по некоторым техническим моментам хочу выразить благодарность моему коллеге Михаилу.