dataLoadCoordinator
Фасет dataLoadCoordinator предназначен для запуска загрузчиков данных и для декларативной привязки загрузчиков данных к контейнерам данных, визуальным компонентам и событиям жизненного цикла экрана.
Основное использование
Чтобы запустить все загрузчики данных на событии BeforeShowEvent экрана, просто добавьте dataLoadCoordinator с атрибутом auto="true" в XML-дескриптор экрана:
<facets>
<dataLoadCoordinator auto="true"/>
</facets>
Режимы работы
dataLoadCoordinator можно настроить для работы в автоматическом, ручном или полуавтоматическом режиме.
Автоматический режим
В автоматическом режиме (auto="true"), dataLoadCoordinator запускает каждый загрузчик, для которого может предоставить значения параметров на событии BeforeShowEvent экрана. Фасет может автоматически сопоставлять параметры в запросе загрузчика со значениями, полученными из контейнеров или визуальных компонентов. Чтобы указать источник, добавьте соответствующий префикс к имени параметра: используйте container_ для значений, получаемых из контейнера, и component_ для значений, получаемых из визуального компонента. Например, параметр container_citiesDc получает своё значение из контейнера citiesDc.
Префиксы по умолчанию можно изменить с помощью атрибутов componentPrefix и containerPrefix
|
Если запрос содержит произвольный параметр без префикса — например, select e from User e where e.city = :city — фасет не сможет его сопоставить, и загрузчик не будет запущен автоматически. В этом случае необходимо самостоятельно установить значение параметра и вызвать userDl.load(). Добавление произвольных параметров внутри дополнительного условия не препятствует выполнению основного запроса загрузчика.
Пример использования:
<view xmlns="http://jmix.io/schema/flowui/view"
title="msg://automaticModeView.title">
<data>
<collection id="citiesDc" class="com.company.onboarding.entity.City"> (1)
<loader id="citiesDl" readOnly="true">
<query>
<![CDATA[select e from City e]]> (2)
<condition>
<and>
<jpql>
<where>e.name like:component_nameField</where> (3)
</jpql>
</and>
</condition>
</query>
</loader>
<fetchPlan extends="_base"/>
</collection>
<collection id="customersDc"
class="com.company.onboarding.entity.Customer">
<loader id="customersDl" readOnly="true">
<query>
<![CDATA[
select e from Customer e
where e.city = :container_citiesDc]]> (4)
</query>
</loader>
<fetchPlan extends="_base"/>
</collection>
</data>
<facets>
<dataLoadCoordinator auto="true"/> (5)
</facets>
<layout>
<textField id="nameField"/> (6)
</layout>
</view>
| 1 | Контейнер данных – содержит сущность City. Его значение будет использовано в параметре :container_citiesDc. |
| 2 | Запрос для сущности City – не содержит параметров и будет выполнен на событии BeforeShowEvent. |
| 3 | Дополнительное условие – добавляется к основному запросу, когда пользователь вводит значение в nameField. |
| 4 | Запрос для сущности Customer – перезагружает строки Customer каждый раз, когда меняется выбранное значение в контейнере citiesDc. |
| 5 | Фасет в автоматическом режиме – автоматически координирует выполнение загрузчиков, обеспечивая правильный порядок выполнения запросов. |
| 6 | Поле ввода – текстовый компонент nameField, значение которого привязано к параметру :component_nameField. |
Ручной режим
В ручном режиме (auto = false) фасет больше не выполняет автоматических действий. Для осуществления загрузки необходимо будет указать событие экрана при наступлении которого фасет будет запускать загрузчик (например, InitEvent), и задать источник каждого параметра запроса — будь то визуальный компонент или контейнер данных. Эти параметры можно задать с помощью вложенных элементов <refresh>.
Пример использования:
<view xmlns="http://jmix.io/schema/flowui/view"
title="msg://manualModeView.title">
<data>
<collection id="citiesDc" class="com.company.onboarding.entity.City"> (1)
<loader id="citiesDl" readOnly="true">
<query>
<![CDATA[select e from City e]]> (2)
<condition>
<and>
<jpql>
<where>e.name like:name</where> (3)
</jpql>
</and>
</condition>
</query>
</loader>
<fetchPlan extends="_base"/>
</collection>
<collection id="customersDc"
class="com.company.onboarding.entity.Customer">
<loader id="customersDl" readOnly="true">
<query>
<![CDATA[
select e from Customer e
where e.city = :city]]> (4)
</query>
</loader>
<fetchPlan extends="_base"/>
</collection>
</data>
<facets>
<dataLoadCoordinator auto="false"> (5)
<refresh loader="citiesDl">
<onViewEvent type="Init"/>
<onComponentValueChanged component="nameField"
likeClause="CASE_INSENSITIVE"
param="name"/> (6)
</refresh>
<refresh loader="customersDl">
<onContainerItemChanged container="citiesDc"
param="city"/> (7)
</refresh>
</dataLoadCoordinator>
</facets>
<layout>
<textField id="nameField"/> (8)
</layout>
</view>
| 1 | Контейнер данных – содержит сущность City. Его значение будет использовано в параметре :city. |
| 2 | Запрос для сущности City – не содержит параметров и будет выполнен на событии InitEvent согласно ручной конфигурации. |
| 3 | Дополнительное условие – добавляется к основному запросу, когда пользователь вводит значение в nameField. |
| 4 | Запрос для сущности Customer – перезагружает строки Customer каждый раз, когда меняется выбранное значение в контейнере citiesDc. |
| 5 | Фасет в ручном режиме – загрузка контролируется правилами, определёнными в элементах <refresh>. |
| 6 | Элемент <refresh> – вызывает загрузчик citiesDl на событии InitEvent, либо когда содержимое компонента nameField передано в параметр name. |
| 7 | Элемент <refresh> – вызывает customersDl, при изменении выбранного экземпляра в citiesDc, передавая этот город как параметр city. |
| 8 | Поле ввода – текстовый компонент nameField чье значение привязано к параметру city через элемент <refresh>. |
Полуавтоматический режим
Фасет можно установить в полуавтоматический режим. В этом режиме координатор автоматически запускает загрузчики (с auto = "true"), но также учитывает любые добавленные вами ручные правила.
Пример использования:
<view xmlns="http://jmix.io/schema/flowui/view"
title="msg://semiautomaticModeView.title">
<data>
<collection id="citiesDc" class="com.company.onboarding.entity.City">
<loader id="citiesDl" readOnly="true">
<query>
<![CDATA[select e from City e]]>
</query>
</loader>
<fetchPlan extends="_base"/>
</collection>
<collection id="customersDc"
class="com.company.onboarding.entity.Customer">
<loader id="customersDl" readOnly="true">
<query>
<![CDATA[
select e from Customer e
where e.city = :container_citiesDc]]>
</query>
</loader>
<fetchPlan extends="_base"/>
</collection>
</data>
<facets>
<dataLoadCoordinator auto="true"> (1)
<refresh loader="citiesDl">
<onViewEvent type="Ready"/> (2)
</refresh>
</dataLoadCoordinator>
</facets>
<layout>
// ...
</layout>
</view>
| 1 | Фасет в полуавтоматическом режиме – фасет будет автоматически запускать загрузчики, если для них не определены иные правила. |
| 2 | Элемент <refresh> – переопределяет автоматическое поведение, указывая, что загрузчик citiesDl должен запускаться в момент генерации события ReadyEvent. |
Атрибуты
|
Вы можете просматривать и редактировать атрибуты фасета в Jmix Studio используя панель испектора Jmix UI. |
-
auto- определяет рабочий режимDataLoadCoordinator. Значение по умолчанию -false.
-
componentPrefix- определяет префикс для параметров, которые относятся к визуальным компонентам, из которыхDataLoadCoordinatorбудет брать значения параметров в автоматическом режиме. Значение по умолчанию -component_.
-
containerPrefix- определяет префикс для параметров, которые относятся к контейнерам данных, из которыхDataLoadCoordinatorбудет брать значения параметров в автоматическом режиме. Значение по умолчанию -container_.
Элемент refresh
Элемент refresh позволяет определить условия, при которых должен быть запущен загрузчик данных.
Единственный атрибут этого элемента - loader, который определяет id загрузчика.
Элемент refresh может иметь следующие вложенные элементы, определяющие условия срабатывания загрузчика:
-
onComponentValueChanged- запуск загрузчика при изменении значение визуального компонента. Он имеет следующие атрибуты:-
component- указываетidвизуального компонента.
-
likeClause- если вы используете выражениеlikeв условии запроса, вы можете определить один из трех возможных режимов поиска:-
NONE- значение по умолчанию. -
CASE_SENSITIVE- поиск с учетом регистра символов. -
CASE_INSENSITIVE- поиск без учета регистра символов.
-
-
param- указывает имя параметра запроса.
-
-
onContainerItemChanged- запуск загрузчика, когда меняется текущий элемент в контейнере данных. Он имеет следующие атрибуты:-
container- указываетidконтейнера данных.
-
param- указывает имя параметра запроса.-
onViewEvent- запуска загрузчика на событии жизненного цикла экрана. Он имеет следующий атрибут:
-
-
type- определяет тип события экрана. Возможные значения:-
Init- для запуска на событииInitEvent. -
BeforeShow- для запуска на событииBeforeShowEvent. -
Ready- для запуска на событииReadyEvent.
-
-