我们当前使用的是 Vaadin Flow 版本 12.0.7(由于某些原因我们无法升级),并且我们希望覆盖 ComboBox 组件的过滤机制。我的意思是,当用户在组合框内输入输入时,我们希望更改组合框后面的项目的搜索方式。
我正在查看Vaadin 文档,了解如何实现组合框的自定义过滤。更具体地说,该部分Filtering by a string
看起来很有希望。
根据 Vaadin 文档,我们实现了一个自定义接口来适应 ComboBox 的搜索方法:
public interface CustomerDataFilter {
List<Customer> fetch(int offset, int limit, String filterText);
int getCount(String filterText);
}
这非常简单,并且与文档示例几乎 1:1 匹配。
然后,我们根据文档创建了一个方法,用数据填充 ComboBox。文档中也几乎使用了 1:1:
private DataProvider<Customer, String>
createDepartmentDataProvider(CustomerDataFilter service)
{
return DataProvider.fromFilteringCallbacks(query -> {
// getFilter returns Optional<String>
String filter = query.getFilter().orElse(null);
return service.fetch(query.getOffset(),
query.getLimit(), filter).stream();
}, query -> {
String filter = query.getFilter().orElse(null);
return service.getCount(filter);
});
}
我们在初始化 ComboBox 的数据时调用上述方法。此时我们还实现了接口(尽管这可能很难看)。然而我们不太确定如何使用这两个接口方法。我们的第一个目标是始终返回所有项目并忽略任何特定过滤,这就是我们sorted始终返回整个列表的原因。这只是为了测试目的,尝试我们是否更改了过滤。
public void updateCustomerList() {
List<Customer> sorted = CustomerService.getInstance().findAll();
//for initial sorting
sorted.sort(new CustomerComperator());
DataProvider<Customer, String> test = createDepartmentDataProvider(new CustomerDataFilter() {
@Override
public int getCount(String filterText) {
return 0;
}
@Override
public List<Customer> fetch(int offset, int limit, String filterText) {
return sorted;
}
});
customerCompany.setItems(sorted);
customerCompany.setDataProvider(test);
}
我们尝试将该getCount值增加到1,但一旦我们将其设置为高于0以下异常,就会发生:
The number of items returned by the data provider exceeds the limit specified by the query (1).
我们的猜测是,我们必须以某种方式调整getCount和fetch方法,以便它们实现我们的自定义搜索。这不会有问题,因为我们有 ComboBox 和filterText. 我们怎么有点困惑为什么我们getCount还需要一个方法以及如何绕过显示的异常?我们的想法是让getCountalways 返回like10并fetch返回我们列表中sorted关于filterText.
任何人都可以详细说明/帮助我们如何实现组合框的自定义过滤或为我们指出正确的轨道吗?
阿波罗的战车
相关分类