#vaadin #crud
Вопрос:
Более позднее редактирование: я заметил, что возврат одного из методов options
in ValueProvider
apply
приводит к присутствию флажка, но, похоже, также показывает предыдущий выбор. Т. Е. если текущее и предыдущее значения различны, отображаются две галочки.
У меня возникли проблемы с привязкой ComboBox. Я не могу com.vaadin.flow.data.binder.Binder
правильно выбрать опцию внутри выпадающего списка — т. Е. поставить галочку в раскрывающемся списке.
Мой связующий файл является «универсальным», т. Е. Я использую его вместе с картой, и я предоставляю динамические средства получения/настройки для различных ключей карты. Итак, подумайте Binder<Map>
, в то время как один из реквизитов внутри карты должен содержать Person
идентификатор пользователя.
ComboBox<Person> combobox = new ComboBox<>("Person");
List<Person> options = fetchPersons();
combobox.setItems(options);
combobox.setItemLabelGenerator(new ItemLabelGenerator<Person>() {
@Override
public String apply(final Person p) {
return p.getName();
}
});
binder.bind(combobox, new ValueProvider<Map, Person>() {
@Override
public Person apply(final Map p) {
return new Person((Long)p.get("id"), (String)p.get("name"));
}
}, new Setter<Map, Person>() {
@Override
public void accept(final Map bean, final Person p) {
bean.put("name", p.getName());
}
});
Интересно, что я мог сделать не так…
Последующее редактирование: Добавление снимка экрана для статуса ComboBox
, который имеет String
заголовок » для «и Integer
значение «для».
Ответ №1:
Ваша проблема в том, что вы создаете новый экземпляр в своей привязке, который не работает. У вас, вероятно, есть какой-то другой боб (я говорю здесь Bean
), где Person
находится свойство. Таким образом , вы хотите использовать Binder
тип Bean
для привязки ComboBox
к свойству, которое является a Person
. А затем заполните свою форму бобом, используя, например binder.readBean(bean)
. Кстати, использование синтаксиса Java 8 делает ваш код гораздо менее подробным.
Bean bean = fetchBean();
Binder<Bean> binder = new Binder();
ComboBox<Person> combobox = new ComboBox<>("Person");
List<Person> options = fetchPersons();
combobox.setItems(options);
combobox.setItemLabelGenerator(Person::getName);
binder.forField(combobox).bind(Bean::getPerson, Bean::setPerson);
binder.readBean(bean);
Комментарии:
1. Я на самом деле использую
com.vaadin.flow.component.crud.BinderCrudEditor
. Мой боб являетсяMap
, поскольку я стремлюсь динамически генерировать форму на основе типа данных каждого свойства. Например, Целое число дает целочисленное поле, LocalDateTime-поле выбора даты и т. Д. Согласитесь с синтаксисом Java 8.2. Я заметил, что при активном отладчике и задержке выполнения во время проверки записи правильно выбираются… Может быть, мы смотрим на какой-нибудь жучок?
3. если я сделаю
combobox.focus(); combobox.blur();
это внутри setItemLabelGenerator, то галочка, наконец, отображается правильно! Для меня это действительно похоже на ошибку… Я даже попробовал это с помощью ComboBox<Целое число >, для простоты, и у меня та же проблема.4. Просто хочу добавить сюда ссылку, которая
Select
работает так, как ожидалось, в отличие отComboBox
.5. Существует известное ограничение с этой галочкой, пустая строка не применяется, см. github.com/vaadin/flow-components/issues/1900 Это ваш сценарий?