具有延迟加载和过滤功能的 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 使用 DataProvider
和 FilterBuilder
,对吗?
所以答案是使用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
);
我的应用程序中有一个标记系统。现在有一个特定的实体,我只想允许一个标签。其实我想为一个标签分配一个父级。 为此,我想使用具有延迟加载和过滤功能的 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 使用 DataProvider
和 FilterBuilder
,对吗?
所以答案是使用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
);