EntityComboBox
EntityComboBox
позволяет пользователям выбирать сущность из выпадающего списка и выполнять действия нажатием на кнопку справа.
EntityComboBox
является по сути гибридом ComboBox и EntityPicker.
XML-имя компонента entityComboBox
.
Основы
Используйте EntityComboBox
, если:
-
Значение поля является ссылкой на экземпляр сущности.
-
Пользователям нужно выбрать один вариант.
-
Список должен быть компактным. Это может быть удобно, если список опций слишком длинный для RadioButtonGroup или SingleSelectList.
-
Пользователям нужна функция фильтрации.
-
Пользователям нужно выполнить некоторые действия над связанным экземпляром сущности.
Не используйте EntityComboBox
, если количество вариантов очень велико (тысячи или более), так как EntityComboBox
загружает весь список вариантов в браузер пользователя и в память сервера. Для выбора из произвольно большого количества вариантов, используйте EntityPicker или SuggestionField.
EntityComboBox
– это текстовое поле с прокручиваемым списком экземпляров сущностей. Этот компонент может иметь как настраиваемые, так и предопределенные действия:
Для создания EntityComboBox
, связанного с данными, используйте атрибуты dataContainer и property. Атрибут optionsContainer используется для создания списка опций:
<data>
<instance id="addressDc" class="ui.ex1.entity.Address"> (1)
<fetchPlan extends="_base"> (2)
<property name="country" fetchPlan="_instance_name"/>
</fetchPlan>
</instance>
<collection id="countriesDc" class="ui.ex1.entity.Country"> (3)
<fetchPlan extends="_base"/>
<loader id="countriesDl">
<query>
<![CDATA[select e from uiex1_Country e]]>
</query>
</loader>
</collection>
</data>
<facets>
<dataLoadCoordinator auto="true"/>
</facets>
<layout>
<vbox spacing="true">
<entityComboBox id="countryField"
caption="msg://ui.ex1.entity/Address.country"
dataContainer="addressDc"
property="country"
optionsContainer="countriesDc"> (4)
<actions>
<action id="lookup" type="entity_lookup"/>
<action id="clear" type="entity_clear"/>
</actions>
</entityComboBox>
</vbox>
</layout>
1 | InstanceContainer для сущности Address . |
2 | Встроенный фетч-план экземпляра сущности, расположенного в контейнере. |
3 | CollectionContainer для сущности Country . |
4 | countryField получает countriesDc как контейнер опций, чтобы отобразить список стран. |
В приведенном выше примере экран определяет контейнер данных addressDc
для сущности Address
, имеющей атрибут country
. В элементе entityComboBox
атрибут dataContainer
содержит ссылку на контейнер данных addressDc
, а атрибут property
ссылается на атрибут сущности country
. Этот атрибут должен быть ссылкой на сущность. В данном примере это Country
.
Действия
Для EntityComboBox
нет действий по умолчанию. Необходимые действия необходимо определять явно, например:
<entityComboBox dataContainer="addressDc"
property="country"
optionsContainer="countriesDc">
<actions>
<action id="lookup" type="entity_lookup"/>
<action id="clear" type="entity_clear"/>
</actions>
</entityComboBox>
Подробная информация об определении настраиваемых и предопределенных действий доступна в разделе Действия компонента EntityPicker
.
Валидация
Для проверки введенных в компонент EntityComboBox
значений можно использовать валидатор во вложенном элементе validators
.
Для EntityComboBox
доступны следующие предопределенные валидаторы:
В приведенном ниже примере показано использование NotNullValidator
для countryValidField
:
<entityComboBox id="countryValidField"
caption="Select a country"
optionsContainer="countriesDc">
<validators>
<notNull/>
</validators>
</entityComboBox>
Обработка пользовательского ввода
Используйте EnterPressHandler
, чтобы позволить пользователям вводить значение, которого нет в изначальном выпадающем списке, и сохранять его, чтобы выбрать элемент позже, не вводя снова:
@Autowired
private CollectionContainer<Country> countriesDc;
@Autowired
private EntityComboBox<Country> countryEntityComboBox;
@Autowired
private DataContext dataContext;
@Install(to = "countryEntityComboBox", subject = "enterPressHandler")
private void countryEntityComboBoxEnterPressHandler(HasEnterPressHandler.EnterPressEvent
enterPressEvent) {
Country country = dataContext.create(Country.class); (1)
country.setName(enterPressEvent.getText()); (2)
countriesDc.getMutableItems().add(country); (3)
countryEntityComboBox.setValue(country);
}
1 | Создание нового экземпляра и помещение его в контекст. |
2 | Установка имени только что созданной сущности country . |
3 | Добавление сущности, находящейся в контексте. |
EnterPressHandler
вызывается, если пользователь ввел значение и нажал Enter. В данном случае новое значение добавляется в список опций и становится доступным для последующего использования.
Слушатели и события
Чтобы сгенерировать заглушку слушателя в Jmix Studio, выберите компонент в XML-дескрипторе экрана или на панели иерархии Jmix UI и используйте вкладку Handlers на панели инспектора Jmix UI. В качестве альтернативы вы можете воспользоваться кнопкой Generate Handler на верхней панели контроллера экрана. |
EnterPressHandler
См. пример программного создания в разделе Handling User Input компонента ComboBox
.
EnterPressHandler
может быть создан декларативно с помощью аннотации @Install
в контроллере экрана. См. пример в разделе Handling User Input компонента EntityComboBox
.
FieldIconProvider
См. FieldIconProvider.
OptionIconProvider
См. OptionIconProvider.
OptionImageProvider
См. OptionImageProvider.
OptionStyleProvider
См. OptionStyleProvider.
OptionsCaptionFilter
См. OptionsCaptionFilter.
Validator
Добавляет экземпляр валидатора в компонент. validator
должен выбросить ValidationException
, если значение недопустимо.
Если вас не устраивают предопределенные валидаторы, добавьте свой собственный экземпляр валидатора:
@Install(to = "iconComboBox", subject = "validator")
protected void iconComboBoxValidator(FontAwesome icon) {
if (icon != null)
if (icon == FontAwesome.FILE_PDF_O)
throw new ValidationException("The file type you selected " +
"is not currently supported");
}
ValueChangeEvent
См. ValueChangeEvent.
XML-атрибуты EntityComboBox
Просматривать и редактировать атрибуты, применимые к компоненту, можно с помощью панели инспектора Jmix UI в конструкторе экранов Studio. |
align - buffered - caption - captionAsHtml - captionProperty - colspan - contextHelpText - contextHelpTextHtmlEnabled - css - dataContainer - description - descriptionAsHtml - editable - enable - box.expandRatio - filterMode - height - htmlSanitizerEnabled - icon - id - inputPrompt - metaClass - nullName - nullOptionVisible - optionsContainer - pageLength - property - required - requiredMessage - responsive - rowspan - stylename - tabIndex - visible - width