Я хотел бы динамически заполнить комбинированный список из Vaadin7, используя API отдыха. API возвращает много значений, если они не отфильтрованы.
Это базовая c идея, которая у меня есть. Я знаю, что версия Vaadin содержит более эффективные способы привязки данных, но мне нужно использовать это устаревшую устаревшую систему.
Моя основная проблема заключается в том, что событие не запускается при вводе новых значений, а также я не уверен, как получить текущее значение в поле со списком, поэтому я могу отправить его в качестве фильтра в API
Вот код
@SpringUI
public class MainView extends UI {
@Autowired
private NameService nameService;
private ComboBox comboBox;
@Override
protected void init(VaadinRequest request) {
VerticalLayout verticalLayout = new VerticalLayout();
comboBox = new ComboBox();
comboBox.setContainerDataSource(getDataSource());
comboBox.setItemCaptionMode(ItemCaptionMode.PROPERTY);
comboBox.setItemCaptionPropertyId("name");
comboBox.setImmediate(true);
comboBox.addValueChangeListener(event -> {
// When I manually enter a property I want to go to the server
// Rest API and get a new List of names
String filter = event.getProperty().toString();
comboBox.setContainerDataSource(getDataSourceWithFilter(filter));
}
);
verticalLayout.addComponent(comboBox);
setContent(verticalLayout);
}
// Get 20 names with a filter
private BeanContainer<String, Name> getDataSourceWithFilter(String filter) {
BeanContainer<String, Name> container = new BeanContainer<>(Name.class);
container.setBeanIdResolver(Name::getId);
// this list comes from a webservice API
List<Name> names = nameService.fetch(filter, 0, 20).collect(Collectors.toList());
container.addAll(names);
return container;
}
// Get 20 (default) names without filtering
private BeanContainer<String, Name> getDataSource() {
return getDataSourceWithFilter("");
}
}