gpt4 book ai didi

java - 将过滤器重新应用到 Vaadin Flow 14 中的 ListDataProvider(对于网格小部件)

转载 作者:行者123 更新时间:2023-12-02 01:05:25 24 4
gpt4 key购买 nike

Vaadin Flow中14网络应用程序,我有一个Grid我的布局上的小部件,由 ListDataProvider 支持。

好像当我调用ListDataProvider::setFilter时,过滤立即生效。 (如果我错了,请纠正我。)

listDataProvider.setFilterByValue(
Product :: getLegacy , // Boolean property on my pojo `Product`.
this.legacy.getValue() // `this.legacy` is a Vaadin `Checkbox` widget. The `getValue` method returns a `Boolean` (presumably).
);

我的过滤器基于 Checkbox 的状态小部件。当用户选中或取消选中该小部件时,我希望启动过滤,并在 Grid 小部件中显示更多或更少的项目。

我想我需要向 Checkbox 小部件添加一个监听器。我想这应该是对 addValueChangeListener 的调用或addClickListener 。或者也许addCheckedChangeListener

➥ 我的问题是:
在该监听器中,我应该做什么来使过滤器重新应用于数据提供程序,从而更改网格中显示的项目?

我应该调用clearFilters吗? ,然后通过调用 setFilter 重置过滤器?看来应该有更直接的方法。

调用ListDataProvider::refreshAll似乎没有效果。根据我对文档的阅读,该方法应该在(a)更改数据提供者已提供的项目的内容时调用,或者(b)在重新填充时调用em> 数据提供者提供的一组项目。所以 refreshAll 似乎与我的目标无关。在我的 Grid 小部件中,ListDataProvider 内容是固定的,不变的。我只是想通过重新激活过滤器来显示/隐藏该网格中的项目。

最佳答案

问题

代码中的问题是,this.legacy.getValue() 行在您定义此过滤器时捕获了 Checkbox 小部件的值。要比较的值是在设置过滤器时从组件中提取的,即使更新组件,该值也保持不变。它基本上与将其分成两行相同:

Boolean value = this.legacy.getValue();  // Captured once, not when user checks/unchecks the checkbox widget.
listDataProvider.setFilterByValue(Product::getLegacy, value);

解决方案

您需要在 Checkbox 小部件的值发生变化、选中或取消选中时捕获其当前状态。

类似这样,监听器使用小部件的当前值重置新过滤器。

this.legacy.addValueChangeListener(
event ->
listDataProvider
.setFilterByValue(
Product::getLegacy ,
event.getValue()
)
;

你不需要做clearFilters()介于两者之间,因为所有 set 方法都会清除任何现有的过滤器。有单独的 add 方法可以保留现有过滤器。

与您在问题中所述相反,refreshAll() 方法确实会导致过滤器针对提供程序中的所有项目再次运行。如果过滤器的定义方式是每次调用时都从组件中读取当前值,则可以使用 refreshAll() 来再次评估过滤器。

listDataProvider.setFilter(
product ->
product.getLegacy().equals( this.legacy.getValue() )
);

通过在上面的行中使用 lambda,当过滤器通过数据提供程序中的项目执行比较时,可以动态捕获legacy 复选框小部件的当前状态。

关于java - 将过滤器重新应用到 Vaadin Flow 14 中的 ListDataProvider(对于网格小部件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60103989/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com