Связыватель данных Vaadin — проблемы с комбинированными блоками

#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 Это ваш сценарий?