моя контактная информация
Почтамезофия@protonmail.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
компоненты(Компонент) — это независимый и многократно используемый компонент в приложении SAPUI5.
SAPUI5 предоставляет следующие два типа компонентов:
безликий компонент (сорт:sap.ui.core.Component
): Отсутствие компонента интерфейса означает отсутствиепользовательский интерфейсСвязанные элементы, используемые в сценариях, не требующих кодирования элементов пользовательского интерфейса;
Компоненты пользовательского интерфейса (сорт:sap.ui.core.UICcomponent
): Компоненты пользовательского интерфейса используются для представления элементов пользовательского интерфейса в интерфейсе приложения, таких как кнопки, а также соответствующих настроек и метаданных.
Примечание. «Безголовые компоненты» нельзя добавить в контейнер компонентов.
Component Container
середина;
sap.ui.core.UICcomComponent расширяет sap.ui.core.Component и добавляет функцию рендеринга экрана на основе sap.ui.core.Component.
Вообще говоря, в приложении полный компонент должен содержать две части: компонентконтроллердокумент(component .js
) и файл дескриптора описания приложения (manifest.json
)。
Самым большим преимуществом использования компонентов является то, что инкапсулированные компоненты можно гибко встраивать вдругой组件容器(Component Container)
середина. Например, Fiori Launchpad — это контейнер компонентов; во время тестирования приложения мы обычно также создаем контейнер компонентов вручную.
Примечание. При создании экземпляра контейнера компонента будет указано пространство имен приложения, и контейнер компонента будет использовать этот путь для поиска файла контроллера компонента.
Ниже приведен пример файла контроллера компонента Component.js:
sap.ui.define([
"sap/ui/core/UIComponent",
"sap/ui/model/json/JSONModel"
], function (UIComponent, JSONModel) {
"use strict";
return UIComponent.extend("my.namespace.demo.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 в атрибуте метаданных. Это означает, что мы будем использовать файл манифеста в формате JSON для определения конфигурации компонента.
Затем в функции init мы сначала вызвали функцию init родительского класса, затем установили модель JSON и установили ее в качестве модели компонента. Эта модель содержит объект-получатель, который имеет атрибут имени со значением World.
После определения файла компонента мы добавим его в файл приложения.index.js
файл, создайте экземпляр контейнера компонента, загрузите созданный компонент и загрузите его на страницу.
Вот пример компонента загрузки файла index.js:
sap.ui.define([
"sap/ui/core/ComponentContainer"
], function (ComponentContainer) {
"use strict";
new ComponentContainer({
name: "my.namespace.demo",
settings : {
id : "demo"
},
async: true
}).placeAt("content");
});
В этом упражнении для блога давайте инкапсулируем все элементы пользовательского интерфейса в компонент, независимый от файла index.html.
Таким образом, всякий раз, когда мы получаем доступ к ресурсу, мы делаем это относительно компонента (а не относительно index.html).
Это архитектурное изменение делает загрузку приложения более гибкой, чем предыдущая статическая страница index.html. Например, ее можно напрямую встроить в такой контейнер, как панель запуска SAP Fiori.
Во-первых, давайтеwebapp
НачальныйComponent.js
Файл для хранения настроек нашего приложения.Когда создается экземпляр компонента, SAPUI5 автоматически вызывает метод компонента.init
функция.Наш компонент наследует от базового классаsap/ui/core/UICcomponent
, в переписанном видеinit
Метод должен сначала вызвать функцию init базового класса.
Файловая структура созданного проекта выглядит следующим образом:
Код Component.js выглядит следующим образом:
sap.ui.define([
"sap/ui/core/UIComponent"
], function (UIComponent) {
"use strict";
return UIComponent.extend("zsapui5.test.Component", {
init() {
// call the init function of the parent
UIComponent.prototype.init.apply(this, arguments);
}
});
});
Далее добавим конфигурацию приложения в файл Component.js.
Модифицированный код Component.js выглядит следующим образом:
sap.ui.define([
"sap/ui/core/UIComponent",
"sap/ui/model/json/JSONModel",
"sap/ui/model/resource/ResourceModel"
], function (UIComponent,JSONModel,ResourceModel) {
"use strict";
return UIComponent.extend("zsapui5.test.Component", {
metadata: {
"interfaces": ["sap.ui.core.IAsyncContentCreation"],
"rootView": {
"viewName": "zsapui5.test.view.App",
"type": "XML",
"id": "app"
}
},
init() {
//call the init function of the parent
UIComponent.prototype.init.apply(this, arguments);
//set data model
const oData = {
recipient : {
name: "World"
}
};
const oModel = new JSONModel(oData);
this.setModel(oModel);
//set i18n model
const i18nModel = new ResourceModel({
bundleName: "zsapui5.test.i18n.i18n"
});
this.setModel(i18nModel, "i18n");
}
});
});
Модифицированный файл компонента .js состоит из двух частей:元数据部分
и вызывается при инициализации компонента.init函数部分
。
Раздел метаданных определяет корневое представление.App.view.xml
ссылку на файл, чтобы компонент мог управлять отображением представления приложения, а не непосредственно вindex.js
Создайте и отобразите корневое представление непосредственно в файле.Часть определения метаданных также реализуетsap.ui.core.IAsyncContentCreation
Интерфейс, позволяющий создавать компоненты полностью асинхронно.
...
metadata: {
"interfaces": ["sap.ui.core.IAsyncContentCreation"],
"rootView": {
"viewName": "zsapui5.test.view.App",
"type": "XML",
"id": "app"
}
...
Обратите внимание, что интерфейс sap.ui.core.IAsyncContentCreation неявно устанавливает как для rootView компонента, так и для конфигурации его маршрутизатора значение «async»: true; мы обсудим его роль в следующем блоге, посвященном описанию «Маршрутизация и навигация».
В разделе функции инициализации мы делаем то же самое, что и раньше.App.controller.js
Создайте экземпляр модели данных, как вы это сделали в файле контроллера.oModel
и модель i18ni18nModel
。
...
init() {
//call the init function of the parent
UIComponent.prototype.init.apply(this, arguments);
//set data model
const oData = {
recipient : {
name: "World"
}
};
const oModel = new JSONModel(oData);
this.setModel(oModel);
//set i18n model
const i18nModel = new ResourceModel({
bundleName: "zsapui5.test.i18n.i18n"
});
this.setModel(i18nModel, "i18n");
}
...
Обратите внимание, что модельПривязка непосредственно к компоненту , а не в корневом представлении компонента. Однако, поскольку вложенные элементы управления автоматически наследуют модель родительского элемента управления, эта модель также доступна в представлении.
Поскольку привязку объектов данных и объектов модели i18n мы уже реализовали в файле Component.js, напишем перед этимApp.controller.js
Логическое удаление файлов контроллера, т.е. удаление onInit 函数
и所需的模块引用
。
Эффект от модифицированного кода следующий:
sap.ui.define([
"sap/ui/core/mvc/Controller",
"sap/m/MessageToast"
], function (Controller, MessageToast) {
"use strict";
return Controller.extend("zsapui5.test.controller.App", {
onShowHello: function () {
// read msg from i18n model
const oBundle = this.getView().getModel("i18n").getResourceBundle();
const sRecipient = this.getView().getModel().getProperty("/recipient/name");
const sMsg = oBundle.getText("helloMsg", [sRecipient]);
// show message
MessageToast.show(sMsg);
}
});
});
В предыдущем файле index.js мы напрямую создали экземпляр объекта представления приложения.XMLView
. Теперь давайте создадим представление через контейнер компонента.
Для этого мы заменяем ранее добавленную зависимость представления новойsap/ui/core/ComponentContainer
Зависимости. Контейнер компонента действует как родительский компонент компонента приложения и обрабатывает его свойства и события навигации.
При создании экземпляра контейнера компонента необходимо указать пространство имен приложения, то естьzsapui5.test
(Он указывает на папку веб-приложения проекта, в которой расположены файлы .js компонента).
Эффект от скорректированного файла index.js следующий:
sap.ui.define([
"sap/ui/core/ComponentContainer"
], function (ComponentContainer) {
"use strict";
new ComponentContainer({
name: "zsapui5.test",
settings : {
id : "test"
},
async: true
}).placeAt("content");
});
При инкапсуляции компонентов приложения мы должны следовать следующим соглашениям:
Component .js
webapp
папкаwebapp
в папкеЗапускаем настроенную программу и эффект следующий:
Приложение работает так же, как и до настройки.Но если оно пройдетctrl + shift + alt + s
Откройте окно диагностики, чтобы просмотреть схему управления, мы можем обнаружить следующие различия.
Недавно добавленный ComponentContainer является родительским элементом управления XMLView.
В этой статье представлены концепция и метод инкапсуляции компонентов в SAPUI5, а также показано их использование на примере.