- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们目前使用的是 Vaadin Flow 版本 12.0.7(由于某些原因我们无法升级)并且我们想要覆盖 ComboBox 组件的过滤机制。我的意思是,当用户在 ComboBox 中输入内容时,我们想更改搜索 ComboBox 后面的项目的方式。
我在看这个Vaadin documentation关于如何实现组合框的自定义过滤。更具体地说,Filtering by a string
部分看起来很有前途。
根据 Vaadin 文档,我们实现了一个自定义接口(interface),用于调整 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 初始化数据时调用上述方法。在这一点上,我们还实现了接口(interface)(尽管这可能很难看)。然而,我们不太确定如何使用这两种接口(interface)方法。我们的第一个目标是始终返回所有项目并忽略任何特定的过滤,这就是我们始终返回整个 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
,就会发生以下异常:
数据提供者返回的项目数超过了查询指定的限制 (1)。
我们的猜测是,我们必须以某种方式调整 getCount
和 fetch
方法,使其实现我们的自定义搜索。这不会有问题,因为我们有 ComboBox 和 filterText
背后的数据。为什么我们还需要一个 getCount
方法以及我们如何绕过显示的异常?我们的想法是让 getCount
总是像 10
一样返回,并且在 fetch
中返回我们的 sorted
列表的子集过滤文本
。
谁能详细说明/帮助我们如何为 ComboBox 实现自定义过滤或为我们指明正确的轨道?
感谢 Steffen Harbichs 的回答,我们找到了实现过滤数据提供程序的方法。基本上这就是它所需要的一切:
public void updateCustomerList() {
List<Customer> sorted = CustomerService.getInstance().findAll();
sorted.sort(new CustomerComperator());
customerCompany.setItems(sorted);
ListDataProvider<Customer> listTest = new ListDataProvider<>(sorted);
customerCompany.setDataProvider(listTest.filteringByPrefix(new CustomerProvider()));
}
CustomerProvider
仅实现适用的 DataProvider 接口(interface)。之后,我们可以简单地应用 filteringByPrefix
方法来更改过滤行为。
最佳答案
您走在正确的轨道上,但您需要了解 DataProvider
的概念首先。
在客户端(浏览器),一旦用户与之交互,Vaadin 请求数据显示在组合框中。请求的数据将类似于“数据中有多少项?”这是 count 查询。假设您有 100 件商品。现在下一个请求是“给我显示前 40 个项目”,这是 fetch 查询。组合框将显示退回的项目。一旦用户向下滚动列表,就会发出另一个数据请求“给我接下来要显示的 40 个项目”等。
总而言之,首先要求 DataProvider
返回所有项目的计数,然后根据需要逐页获取数据。当用户输入过滤器时,这也适用。不同之处在于您的计数和提取查询应该考虑过滤器。
示例:用户输入过滤器“xyz”,现在只有 50 个项目匹配此过滤器(按名称或其他方式),因此您将在 count 方法中返回 50,并且您的 fetch 方法应该相应地进行过滤。
您遇到的异常只是指出您的 fetch 方法返回的项目多于 Vaadin 请求的项目(查询参数中的“limit”参数)。这是因为您当前没有处理偏移量/限制。
您有两种选择来实现您的数据提供程序:
Vaadin 提供 ListDataProvider
这是列表的 DataProvider
实现。分页已经在实现中完成,您不必关心它。使用 filteringBy
方法根据输入的过滤文本过滤数据。
这种方式更简单,但无法扩展。这意味着如果您有很多项目,您将消耗大量内存和 CPU,因为整个数据都是从后端检索到列表中的。如果您预计您的项目数量很少,请采用这种方法。
您可以实现自己的 DataProvider
。我建议首先扩展 AbstractBackendDataProvider
类 ( javadoc )。需要实现方法 sizeInBackend
和 fetchFromBackend
。请注意 offset/limit 参数以在 fetch 方法中实现分页。
如果您将分页委托(delegate)给您的数据库(例如 SQL 或非 SQL 数据库),则此方法是可扩展的。由于您只在内存中保留一页,因此内存占用量会很低。
关于java - 如何在 Vaadin Flow 中使用带有 DataProvider 的自定义组合框过滤?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57921932/
场景 网站页面有一个带有分页、过滤、排序功能的表格 View 。 表中的数据是从REST API服务器获取的,数据包含数百万条记录。 数据库 REST API 服务器 Web 服务器 浏览器 问
我有一个表student,其中的列dte_date(日期)具有值(2019-01-01、2019-02-01、2019-03-01)。 .等) 条件: dte_date 列中没有重复值。 但 dte_
我有一些逻辑可以根据不活动的用户创建通知。我正在获取具有以下属性的用户列表。我想做的只是在部门有非 Activity 用户时触发我的创建通知方法。因此,给出下面的列表,基本上会创建 1 个通知,表示部
使用 GPS 开发跟踪应用程序。一切都很好,但有时由于封闭区域或恶劣天气,我得到的分数不准确。当您绘制它们时,它看起来不对,有很多跃点/跳跃。 我应该运行什么算法来过滤掉不良信号对我来说,这看起来像是
我正在尝试按变量类型过滤对象数组。节点是一个具有位置的对象,但以不同的方式定义——作为点、矢量或附件。这是一个代码: class Joint { var position:Position
我想做的是在向量上创建一个过滤器,以便它删除未通过谓词测试的元素;但不太确定我该怎么做。 我根据谓词评估输入向量中的每个元素,例如在我的代码中,is_even 仿函数在 device_vector 向
我是 Gremlin 的新手,我正在使用 Gremlin 3.0.2 和 Stardog 5.0。我编写此查询是为了找出 schema.org 本体中两个实体之间的路径。以下是输出 - gremlin
考虑以下示例数据表, dt 30 的那一行需要去 - 或者如果其中两行 > 30相隔几秒钟,删除所有 3 个。然而 ,当我们有 4 行或更多行时,我们需要删除时间差 > 30 没有另一对 < 30
我正在考虑使用 ZeroMQ,并尝试了一些示例。但是,我无法验证 ZeroMQ 是否支持一些重要的要求。我希望你能帮助我。 我将使用这个简单的场景来问我的问题: 出版商(例如交易所)提供(大量)股票的
我需要从我的查询中过滤掉大量的对象。目前,它正在抓取类中的所有对象,我想将其过滤为查询字符串中的相关对象。我怎样才能做到这一点?当我尝试时,我收到一个属性错误说明 ''QuerySet' object
如何在 Prometheus 查询中添加标签过滤器? kube_pod_info kube_pod_info{created_by_kind="ReplicaSet",created_by_name=
我有包含字符串的列的数据框,并希望过滤掉包含某些字符串以外的任何内容的所有行。考虑下面的简化示例: string % dplyr::filter(stringr::str_detect(string,
我有以下数据框,其中包含多行的角度变化值: 'data.frame': 712801 obs. of 4 variables: $ time_passed: int 1 2 3 4 5 6
我有一个 BehaviorSubject我希望能够filter ,但要保持新订阅者在订阅时始终获得一个值的行为主题式质量,即使最后发出的值被过滤掉。有没有一种简洁的方法可以使用 rxjs 的内置函数来
我有一个 RSS 提要,每天输出大约 100 篇文章。我希望过滤它以仅包含更受欢迎的链接,也许将其过滤到 50 个或更少。回到当天,我相信您可以使用“postrank”来做到这一点,但在谷歌收购后现已
我有这样一个重复的xml树- this is a sample xml file yellowred blue greyredblue 如您所见,每个项目可以具有不同数量的颜色标签
我以为我在 Haskell 学习中一帆风顺,直到... 我有一个 [[Int]] tiles = [[1,0,0] ,[0,1,0] ,[0,1,0]
我在使用 Knockout.js 过滤可观察数组时遇到问题 我的js: 包含数据的数组 var docListData = [ { name: "Article Name 1", info:
我在 mongoDB 中有这个架构: var CostSchema = new Schema({ item: String, value: Number }); var Attachm
给定一个数据框“foo”,我如何才能只选择“foo”中的那些行,例如foo$location =“那里”? foo = data.frame(location = c("here", "there",
我是一名优秀的程序员,十分优秀!