3.6.1. Внешний компонент¶
3.6.1.1. Глоссарий¶
Серверный код компонента содержится в Abi-файле прикладного модуля.
Клиентский код компонента содержится в
*.jsфайле внешнего JS модуля.
3.6.1.2. Модель данных¶
Модель данных внешнего компонента является деревом [E/P]ExtModelBranch узлов.
Содержит служебную информацию, необходимую для функционирования компонента, и данные, отображаемые в UI-элементах, компонента.
Корневой узел модели данных создаётся при создании Ext-компонента по умолчанию.
Дочерние узлы модели данных создаются разработчиком компонента в серверном коде Abi компонента при необходимости.
Каждый узел модели данных может содержать в качестве значения: JsonObject / JsonArray / String / byte[].
[E/P]ExtComponent <-- внешний компонент.
|--[E/P]ExtModelBranch <-- корень модели данных внешнего компонента.
|-- [E/P]ExtModelBranch
|-- [E/P]ExtModelBranch
|-- [E/P]ExtModelBranch
See also
3.6.1.3. Алгоритм работы¶
3.6.1.3.1. Определение метаданных¶
В Avm выборки указываются name
и/или backendClass,
frontendUri.
backendClass и frontendUri могут быть сопоставлены name в файле META-INF/web-extensions.xml соответствующего
прикладного модуля.
1<?xml version="1.0" encoding="UTF-8"?>
2<exts module="btk">
3 <ext name="HtmlFrame" backendClass="ru.bitec.app.btk.html.web.Btk_HtmlControlAbi" frontendUri="ru/bitec/app/btk/html/web/main.js"/>
4</exts>
3.6.1.3.2. Создание серверной модели компонента¶
После открытия выборки данных, при создании фрейма с внешним компонентом, через
Abi-фабрику, создаётся экземпляр *Abi.scala класса.Вызывается метод
ru.bitec.app.gtk.gl.ext.ExtComponentAbi#onBuild, где серверный прикладной код компонента формирует модель данных.Серверная модель компонента помечается к отправке на презентер.
3.6.1.3.3. Создание клиентской модели компонента¶
При получении браузером модели внешнего компонента, формируется корневой HTML-элемент компонента, определяющий границы компонента.
После физического присоединения корневого HTML-элемента к DOM приложения, инициируется загрузка JS-модуля, относительный адрес которого указан в настройках внешнего компонента или свойстве метаданных выборки
frontendUri.На событие получения ссылки на JavaScript модуль, вызывается один из методов
ExtJsModule:createControl(name),createComposer(name)для получения JavaScript-объекта с клиентским кодом внешнего компонента.Note
Получение ссылки на JavaScript модуль всегда асинхронно, не зависимо от источника JavaScript модуля: сервер или кэша приложения. Это необходимо для обеспечения единообразия в работе компонентов.
Выполняется инициализация компонента вызовом
ExtComponent.init(ExtContext extContext). Через переданную ссылку на контекстExtContext, компонент, реализовав обработчик событийExtChangeModelHandler, подписывается на событие изменения модели данных.Выполняется присоединение компонента к DOM приложения вызовом
ExtComponent.attach(parent). JS-код, на основе модели данных создаёт, DOM-структуру компонента.
3.6.1.3.4. Работа компонента¶
Взаимодействие между серверным и клиентским кодом осуществляется через передачу состояния модели данных компонента с сервера на клиент и обработку событий
ExtChangeModelHandler.Клиентский код может посылать на сервер JSON-запросы через методы контроллера компонента
ExtController:postAsyncRequest(request),postSyncRequest(request),postInputData(inputMarker, inputData).Компонент реагирует на действия пользователя выполняя обработку событий от HTML-элементов в JS-коде.
3.6.1.3.5. Уничтожение клиентской модели компонента¶
При уничтожении фрейма с внешним компонентом, выполняются:
Отсоединение компонента от DOM-модели приложения вызовом
ExtComponent.detach().Высвобождение ресурсов компонента вызовом
ExtComponent.destroy().Освобождение ссылки на JS-модуль.
3.6.1.3.6. Уничтожение серверной модели компонента¶
Вызывается метод
ru.bitec.app.gtk.gl.ext.ExtComponentAbi#onClear, где серверный прикладной код компонента уничтожает модель данных.
See also
Метаданные:
ExtControl,ExtComposerCore-интерфейсы:
CoreExtAbiFactory,CoreExtComponentAbi,CoreExtComponent