sapui5 Две привязки работают, вызывая backend. Одна привязка не будет вызывать бэкэнд
Эксперты. Можете ли вы помочь мне решить эту тайну. Я получил пример пошагового руководства в https://sapui5.hana.ondemand.com/ и адаптировал его, чтобы я мог создать простую привязку к службе OData.
Позвольте мне поделиться основными файлами:
Component.js
sap.ui.define([
"sap/ui/core/UIComponent",
"sap/ui/model/json/JSONModel"
], function (UIComponent, JSONModel) {
"use strict";
return UIComponent.extend("BasicMessages.Component", {
metadata : {
manifest: "json"
},
init : function () {
// call the init function of the parent
UIComponent.prototype.init.apply(this, arguments);
// set data model
var oData = {
recipient : {
name : "World"
}
};
var oModel = new JSONModel(oData);
this.setModel(oModel,"json");
}
});
});
Manifest.json (скрыл URI службы, но он правильно настроен)
{
"_version": "1.8.0",
"sap.app": {
"id": "BasicMessages",
"type": "application",
"i18n": "i18n/i18n.properties",
"title": "{{appTitle}}",
"description": "{{appDescription}}",
"applicationVersion": {
"version": "1.0.0"
},
"dataSources": {
"mainService": {
"uri": "hidden_service_uri",
"type": "OData",
"settings": {
"odataVersion": "2.0",
"localUri": "localService/metadata.xml"
}
}
}
},
"sap.ui": {
"technology": "UI5",
"deviceTypes": {
"desktop": true,
"tablet": true,
"phone": true
}
},
"sap.ui5": {
"rootView": {
"viewName": "BasicMessages.view.App",
"type": "XML",
"async": true,
"id": "app"
},
"dependencies": {
"minUI5Version": "1.30",
"libs": {
"sap.m": {
}
}
},
"models": {
"i18n": {
"type": "sap.ui.model.resource.ResourceModel",
"settings": {
"bundleName": "BasicMessages.i18n.i18n"
}
},
"": {
"dataSource": "mainService",
"settings": {
"defaultUpdateMethod": "PUT",
"useBatch":false,
"metadataUrlParams": {
"sap-documentation": "heading"
},
"defaultBindingMode": "TwoWay"
}
}
}
}
}
App.controller.js
sap.ui.define([ "sap/ui/core/mvc/Controller", "sap/m/MessageToast" ],
function (Controller, MessageToast) {
"use strict";
return Controller.extend("BasicMessages.controller.App", {
onShowHello : function () {
// read msg from i18n model
var oBundle = this.getView().getModel("i18n")
.getResourceBundle();
var sRecipient = this.getView().getModel("json")
.getProperty("/recipient/name");
var sMsg = oBundle.getText("helloMsg", [ sRecipient ]);
// show message
MessageToast.show(sMsg);
},
onInit : function () {
this.getView()
.setModel(this.getOwnerComponent().getModel());
}
});
});
App.view.xml (это хитрый файл)
1 - <mvc:View controllerName="BasicMessages.controller.App" xmlns="sap.m"
2 - xmlns:mvc="sap.ui.core.mvc">
3 - <Button text="{i18n>showHelloButtonText}" press="onShowHello" />
4 - <Input value="{json>/recipient/name}" description="Hello
5 - {json>/recipient/name}"
6 - valueLiveUpdate="true" width="60%" />
7 - <Text
8 - text="{/Caixas(Id='0001',InicioValidade='20180712193002')/Descricao}" />
9 -
10 - <List items="{/Caixas}">
11 - <StandardListItem title="{Descricao}" />
12 -
13 - </List>
14 -
15 - </mvc:View>
Если я использую файл представления точно так же, он вызывает службу OData на сервере и получает список (строки с 10 по 13) и текстовые (строки с 7 по 8) элементы содержимого.
ссылка на скриншот: https://pin.it/zupo3ntgsaymho
Если я прокомментирую строки списка (строки с 10 по 13), служба OData не будет вызвана, и текстовый элемент (строки с 7 по 8) не будет заполнен текстом.
ссылка на скриншот: https://pin.it/pq52tqn53prhtj
Почему это происходит???
2 ответа
Получил ответ по SAP Docs
Примечание. Запросы к серверной части инициируются привязками списков (ODataListBinding), привязками элементов (ODataContextBinding) и функциями CRUD, предоставляемыми ODataModel. Привязки свойств (ODataPropertyBindings) не вызывают запросы.
Я думаю, Рафаэль объяснил, почему это происходит (ваш вопрос), чтобы теперь ответить на незаданный вопрос "как заставить это работать":
Вам нужно будет связать элемент управления Text с правами и text
собственность на Descricio
атрибут, в основном что-то вроде этого:
<Text binding="{/Caixas(Id='0001',InicioValidade='20180712193002')" text="{Descricao}" />
(извините, среды исполнения ui5 нет, так что я не запускал ее)