entityPicker
Поле ввода для выбора экземпляра сущности через диалоговое окно и выполнения над ним различных действий. Это могут быть как предопределенные действия, такие как обновление информации об экземпляре, так и пользовательские, настраиваемые действия для выполнения более специфических задач.
-
XML-элемент:
entityPicker
-
Java-класс:
EntityPicker
Основы
Компонент entityPicker
обычно используется, когда значение поля должно представлять собой ссылку на сущность. Он сочетает в себе возможность выбора конкретного экземпляра сущности с возможностью выполнения соответствующих действий.
Нажатие на кнопку выбора открывает диалоговое окно с экраном списка, содержащим экземпляры сущности.
![]() |
![]() |
Как и другие экраны в приложении, этот экран является настраиваемым и позволяет отображать несколько атрибутов, чтобы пользователи могли легко идентифицировать нужный экземпляр. Оно предоставляет больше контекста по сравнению с entityComboBox, который показывает только названия экземпляров.
Если количество экземпляров велико, дополнительные элементы загружаются динамически при прокрутке списка.
Быстрый старт
Следующий пример демонстрирует, как использовать компонент entityPicker
для выбора отдела, к которому принадлежит пользователь:
Для корректной работы примера убедитесь, что определили экран списка для сущности Department .
|
<data>
<instance class="com.company.onboarding.entity.User" id="userDc"> (1)
<fetchPlan extends="_base"> (2)
<property name="department" fetchPlan="_base"/>
</fetchPlan>
<loader id="userDl"/>
</instance>
</data>
<facets>
<dataLoadCoordinator auto="true"/> (3)
</facets>
<layout>
<entityPicker id="entityPicker"
dataContainer="userDc"
property="department"
label="Department"> (4)
<actions>
<action id="entityLookup" type="entity_lookup"/> (5)
<action id="entityClear" type="entity_clear"/> (6)
</actions>
</entityPicker>
</layout>
1 | Контейнер данных для хранения экземпляра User , который в данный момент редактируется. |
2 | Фетч-план расширен для получения коллекции экземпляров Department , которые будут доступны для выбора. |
3 | Координатор загрузки данных для автоматического предоставления компоненту экземпляров для выбора. |
4 | Привязка компонента к контейнеру данных и свойству. |
5 | Добавление предопределенного действия для открытия экрана выбора. |
6 | Добавление предопределенного действия для очистки выбора. |
Для получения более интерактивных примеров entityPicker
и его вариаций смотрите:
Привязка данных
Привязка данных относится к связыванию визуального компонента с контейнером данных. Изменения в визуальном компоненте или соответствующем контейнере данных могут вызывать обновления друг друга. Подробности смотрите в разделе Использование компонентов данных.
Выбор экземпляра
Если вам просто нужен способ выбора экземпляра определенной сущности, укажите эту сущность, используя атрибут metaClass:
<entityPicker metaClass="Department">
//...
</entityPicker>
Выбор экземпляра для обновления связанного атрибута
Выбор экземпляра часто предназначен для обновления атрибута в другом экземпляре. В примере выше выбор экземпляра Department
обновляет экземпляр User
, связывая его с выбранным отделом.
В таких случаях вам нужно будет привязать компонент к контейнеру данных, содержащему экземпляр, и указать атрибут для обновления, используя dataContainer и property соответственно:
<entityPicker dataContainer="userDc" property="department">
//...
</entityPicker>
Действия
Вы можете определить пользовательские и предопределенные действия для entityPicker
, отображаемые в виде кнопок справа. Это можно сделать либо в XML-дескрипторе, используя вложенный элемент actions
, либо программно в контроллере, используя метод addAction()
.
Чтобы добавить действие в Jmix Studio, выберите компонент в XML-дескрипторе экрана или в панели структуры Jmix UI и нажмите кнопку Add в панели инспектора Jmix UI. |
Предопределенные действия
Когда Studio генерирует entityPicker
в экране деталей, он также генерирует два предопределенных стандартных действия: entity_lookup
и entity_clear
. Существуют также действия entity_open
и entity_openComposition
.
Используйте атрибуты type
и id
для объявления предопределенного действия в XML.
Если вы создаете entityPicker
без действий, загрузчик XML определит только действия entity_lookup
и entity_clear
. Чтобы добавить другое предопределенное действие, например, entity_open
, необходимо указать элемент actions
следующим образом:
<entityPicker dataContainer="userDc"
property="department"
label="Department" >
<actions>
<action id="entityLookup" type="entity_lookup"/>
<action id="entityClear" type="entity_clear"/>
<action id="entityOpen" type="entity_open"/>
</actions>
</entityPicker>
Элемент actions
не расширяет, а переопределяет набор стандартных действий. Вам следует явно определить идентификаторы всех необходимых действий.
Пользовательские действия
Чтобы определить пользовательское действие в XML, используйте вложенный элемент actions
. Укажите атрибуты id
и icon
для действия:
<entityPicker id="departmentEntityPicker"
dataContainer="userWithDeptManagerDc"
property="department">
<actions>
<action id="entityLookup" type="entity_lookup"/>
<action id="knowManager" icon="QUESTION"
description="Know HR-manager"/>
</actions>
</entityPicker>
Затем реализуйте пользовательскую логику в контроллере экрана, подписавшись на ActionPerformedEvent
:
@ViewComponent
private EntityPicker<Department> departmentEntityPicker;
@Autowired
private Notifications notifications;
@Subscribe("departmentEntityPicker.knowManager")
public void onKnowManager(ActionPerformedEvent event) {
Department department = departmentEntityPicker.getValue();
if (department != null)
notifications.create(department.getName() + " has "
+ department.getHrManager() + " HR-manager")
.show();
else notifications.create("Choose a department").show();
}
Вы можете сгенерировать заглушку обработчика |
Добавление действий программно
Используйте метод addAction()
для установки действий программно.
-
Добавление стандартного действия
Например, если компонент определен в XML-дескрипторе без вложенного элемента
actions
, достаточно добавить недостающие стандартные действия:@ViewComponent private EntityPicker<Department> departmentEntityPicker; @Autowired private Actions actions; @Subscribe public void onInit(InitEvent event) { departmentEntityPicker.addAction(actions.create(EntityOpenAction.ID)); }
-
Добавление пользовательского действия
Пример создания пользовательского действия:
@ViewComponent private EntityPicker<Department> departmentEntityPicker; @Subscribe public void onInit(InitEvent event) { departmentEntityPicker.addAction(new BaseAction("showManager") .withIcon(VaadinIcon.QUESTION_CIRCLE) .withHandler(e -> { Department department = departmentEntityPicker.getValue(); if (department != null) notifications.create(department.getName() + " has " + department.getHrManager() + " HR-manager") .show(); else notifications.create("Choose a department").show(); })); }
Атрибуты
id - alignSelf - allowCustomValue - ariaLabel - ariaLabelledBy - autofocus - classNames - colspan css - dataContainer - enabled - errorMessage - focusShortcut - height - helperText - label - maxHeight - maxWidth - metaClass - minHeight - minWidth - placeholder - property - readOnly - required - requiredMessage - tabIndex - themeNames - title - visible - width
metaClass
Вы можете использовать entityPicker
без привязки к контейнеру данных, то есть без установки dataContainer
и property
. В этом случае следует использовать атрибут metaClass
для указания типа сущности для entityPicker
. Например:
<entityPicker metaClass="Department">
<actions>
<action id="entityLookup" type="entity_lookup"/>
<action id="entityOpen" type="entity_open"/>
</actions>
</entityPicker>
Вы можете получить экземпляр выбранной сущности, инжектировав компонент в контроллер и вызвав его метод getValue()
.
Обработчики
AttachEvent - BlurEvent - ComponentValueChangeEvent - CustomValueSetEvent - DetachEvent - FocusEvent - formatter - statusChangeHandler - validator
Чтобы сгенерировать заглушку обработчика в Jmix Studio, используйте вкладку Handlers панели инспектора Jmix UI, или команду Generate Handler, доступную на верхней панели контроллера экрана и через меню Code → Generate (Alt+Insert / Cmd+N). |