- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在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/
我是一名优秀的程序员,十分优秀!