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.
За помощь и консультацию по некоторым техническим моментам хочу выразить благодарность моему коллеге Михаилу.