具有延迟加载和过滤功能的 Vaadin 22 ComboBox

Vaadin 22 ComboBox with Lazy Loading and Filtering

我的应用程序中有一个标记系统。现在有一个特定的实体,我只想允许一个标签。其实我想为一个标签分配一个父级。 为此,我想使用具有延迟加载和过滤功能的 VaadinCombobox。

我的数据层是Spring Boot Neo4J Data。我有一个这样的存储库:

Page<TagListDto> searchPaginated(String searchTerm, Pageable page);

这为我提供了一个数据传输对象,用于按 searchTerm 过滤的列表显示。该列表是可分页的。我使用相同的方法过滤网格。

所以我可以这样做,如果我知道从哪里得到 searchTerm。

ComboBoxLazyDataView<TagListDto> dataView = parentTag.setItems(query ->
            tagRepository.searchPaginated(searchTerm,
                       PageRequest.of(query.getPage(), query.getLimit())).stream());
parentTag.setItemLabelGenerator(TagListDto::getName);

但我可能不得不为 ComboBox 使用 DataProviderFilterBuilder,对吗?

所以答案是使用setItemsWithFilterConverter-方法。您在 combo-box 字段中输入的内容将作为 String 发送到过滤器转换器(第二个方法参数),然后作为 query 对象的 属性 传递以执行搜索(第一个方法参数)。

因此,如果您需要将搜索词的类型从 String 转换为其他类型,添加通配符或其他任何内容,请在第二个 labda 中执行。 使用第一个 lambda 中的 query.getFilter(),您可以检索搜索词,然后使用它向您的后端进行查询。

这是一个例子:

ComboBox<Person> personComboBox = new ComboBox<>();
personComboBox.setItemLabelGenerator(Person::getName);
personComboBox.setItemsWithFilterConverter(
                query -> personService.searchPaginated(query.getFilter().orElse(""),
                                                       PageRequest.of(query.getPage(),
                                                       query.getLimit())).stream(),
                personSearchTerm -> personSearchTerm
        );