DataLoadCoordinator
DataLoadCoordinator
– это фасет, предназначенный для запуска загрузчиков данных и для декларативного связывания загрузчиков данных с контейнерами данных, визуальными компонентами и событиями экрана.
XML-имя компонента: dataLoadCoordinator
.
Основы использования
Чтобы запустить все загрузчики данных в BeforeShowEvent экрана или AttachEvent фрагмента, просто добавьте DataLoadCoordinator
с auto="true"
в XML-дескриптор экрана:
<facets>
<dataLoadCoordinator auto="true"/>
</facets>
Режимы работы
DataLoadCoordinator
может работать в автоматическом, ручном или полуавтоматическом режиме.
Автоматический режим
В этом режиме DataLoadCoordinator
полагается на имена параметров, имеющие специальные префиксы. Префикс указывает, какой компонент является источником значения параметра и событий его изменения.
По умолчанию используется префикс container_
для контейнеров данных и component_
для визуальных компонентов. Атрибуты componentPrefix и containerPrefix позволяют использовать другие префиксы.
При автоматической конфигурации, если у загрузчика нет параметров в основном тексте запроса (то есть в статическом запросе не включающем условия), то он срабатывает по событию BeforeShowEvent
в Screen
или по событию attachEvent
в ScreenFragment
.
Если в основном тексте запроса задать параметр без префикса Для запуска такого загрузчика можно просто задать значения параметров и вызвать метод |
Пример использования:
<window caption="msg://automaticModeScreen.caption"
xmlns="http://jmix.io/schema/ui/window"
xmlns:c="http://jmix.io/schema/ui/jpql-condition"> (1)
<data readOnly="true">
<collection id="citiesDc"
class="ui.ex1.entity.City">
<fetchPlan extends="_base"/>
<loader id="citiesDl">
<query>
<![CDATA[select e from uiex1_City e]]> (2)
<condition>
<and>
<c:jpql>
<c:where>e.name like :component_nameField</c:where> (3)
</c:jpql>
</and>
</condition>
</query>
</loader>
</collection>
<collection id="customersDc"
class="ui.ex1.entity.Customer">
<fetchPlan extends="_base"/>
<loader id="customersDl" >
<query>
<![CDATA[
select e from uiex1_Customer e
where e.city = :container_citiesDc
]]> (4)
</query>
</loader>
</collection>
</data>
<facets>
<dataLoadCoordinator auto="true"/>
</facets>
<layout>
<textField id="nameField"/>
</layout>
</window>
1 | Добавляет XML-схему для условий JPQL. |
2 | В запросе нет параметров, поэтому загрузчик citiesDl сработает на событие BeforeShowEvent . |
3 | Загрузчик citiesDl также сработает на изменение значения компонента nameField .
Так как условие использует оператор like , значение будет автоматически завернуто в '(?i)% %' для того, чтобы обеспечить нечувствительный к регистру поиск. |
4 | Загрузчик customersDl сработает при смене выбранной сущности в контейнере citiesDc . |
Ручной режим
В этом режиме вложенные элементы refresh определяют, когда должны сработать загрузчики.
Пример использования:
<window caption="msg://manualModeScreen.caption"
xmlns="http://jmix.io/schema/ui/window"
xmlns:c="http://jmix.io/schema/ui/jpql-condition"> (1)
<data readOnly="true">
<collection id="citiesDc"
class="ui.ex1.entity.City">
<fetchPlan extends="_base"/>
<loader id="citiesDl">
<query>
<![CDATA[select e from uiex1_City e]]>
<condition>
<and>
<c:jpql>
<c:where>e.name like :name</c:where>
</c:jpql>
</and>
</condition>
</query>
</loader>
</collection>
<collection id="customersDc"
class="ui.ex1.entity.Customer">
<fetchPlan extends="_base"/>
<loader id="customersDl" >
<query>
<![CDATA[
select e from uiex1_Customer e
where e.city = :city
]]>
</query>
</loader>
</collection>
</data>
<facets>
<dataLoadCoordinator>
<refresh loader="citiesDl">
<onScreenEvent type="Init"/> (2)
<onComponentValueChanged component="nameField"
likeClause="CASE_INSENSITIVE"
param="name"/> (3)
</refresh>
<refresh loader="customersDl">
<onContainerItemChanged container="citiesDc"
param="city"/> (4)
</refresh>
</dataLoadCoordinator>
</facets>
<layout>
<textField id="nameField"/>
</layout>
</window>
1 | Добавляет XML-схему для условий JPQL. |
2 | Загрузчик citiesDl сработает на событие InitEvent . |
3 | Загрузчик citiesDl также сработает на изменение значения компонента nameField .
Атрибут likeClause приводит к заворачиванию значения в '(?i)% %' для того, чтобы обеспечить нечувствительный к регистру поиск. |
4 | Загрузчик customersDl сработает при смене выбранной сущности в контейнере citiesDc . |
Полуавтоматический режим
Когда атрибут auto
установлен в true
и объявлены некоторые вручную сконфигурированные связи, DataLoadCoordinator
автоматически сконфигурирует все загрузчики, для которых не указано ни одной связи вручную.
Пример использования:
<window caption="msg://semiAutomaticModeScreen.caption"
xmlns="http://jmix.io/schema/ui/window">
<data readOnly="true">
<collection id="brandsDc"
class="ui.ex1.entity.Brand">
<fetchPlan extends="_base"/>
<loader id="brandsDl">
<query>
<![CDATA[select e from uiex1_Brand e]]>
</query>
</loader>
</collection>
<collection id="customersDc"
class="ui.ex1.entity.Customer">
<fetchPlan extends="_base"/>
<loader id="customersDl" >
<query>
<![CDATA[
select e from uiex1_Customer e
where e.favouriteBrands = :container_brandsDc
]]> (1)
</query>
</loader>
</collection>
</data>
<facets>
<dataLoadCoordinator auto="true">
<refresh loader="brandsDl">
<onScreenEvent type="AfterShow"/> (2)
</refresh>
</dataLoadCoordinator>
</facets>
<layout>
</layout>
</window>
1 | Загрузчик customersDl сконфигурирован автоматически и сработает при смене выбранной сущности в контейнере brandsDc . |
2 | Загрузчик brandsDl сконфигурирован вручную и сработает на событие экрана AfterShowEvent . |
Атрибуты
-
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
- задает имя параметра запроса.
<dataLoadCoordinator> <refresh loader="citiesDl"> <onComponentValueChanged component="nameField" likeClause="CASE_SENSITIVE" param="name"/> </refresh> </dataLoadCoordinator>
-
-
onContainerItemChanged
- загрузчик срабатывает при изменении текущего элемента в контейнере данных. Этот элемент имеет следующие атрибуты:-
container
- задаетid
контейнера данных.
-
param
- задает имя параметра запроса.
<dataLoadCoordinator> <refresh loader="citiesDl"> <onContainerItemChanged container="citiesDc" param="name"/> </refresh> </dataLoadCoordinator>
-
-
onScreenEvent
- загрузчик срабатывает по событию экрана. Этот элемент имеет следующие атрибуты:-
type
- определяет тип экранного события. Возможные значения:-
Init
- срабатывание по InitEvent. -
AfterInit
- срабатывание по on AfterInitEvent. -
BeforeShow
- срабатывание по BeforeShowEvent. -
AfterShow
- срабатывание по AfterShowEvent.
-
<dataLoadCoordinator> <refresh loader="citiesDl"> <onScreenEvent type="BeforeShow"/> </refresh> </dataLoadCoordinator>
Триггеры onScreenEvent
срабатывают после слушателей соответствующих событий, заданных в контроллере экрана аннотациями@Subscribe
. -
-
onFragmentEvent
- загрузчик срабатывает по событию фрагмента экрана. Этот элемент имеет следующий атрибут:-
type
- определяет тип события фрагмента. Возможные значения:-
Init
- срабатывание по InitEvent. -
AfterInit
- срабатывание по AfterInitEvent. -
Attach
- срабатывание по AttachEvent.
-
<dataLoadCoordinator> <refresh loader="citiesDl"> <onFragmentEvent type="Init"/> </refresh> </dataLoadCoordinator>
-
Все XML-атрибуты
Вы можете просматривать и редактировать применимые к фасету атрибуты с помощью панели инспектора Jmix UI в дизайнере экранов Studio. |
auto - componentPrefix - containerPrefix - id