【发布时间】:2020-09-13 07:54:26
【问题描述】:
我在 Vaadin 14 中使用Grid。网格处于多选模式。
选择处理程序需要几秒钟才能完成,我在最后调用 setItems(...) 来更新网格中的项目。
当用户在前一个选择处理程序仍在运行时选择另一行时,我收到类似于https://github.com/vaadin/vaadin-grid-flow/issues/322 中描述的“未知键”错误,即使新的项目集仍然包含选定的项目(另一个对象实例,但根据equals() 相同)。这似乎是因为KeyMapper 中的密钥已因setItems() 而更改,因此来自客户端的密钥不再存在。
有没有办法解决这个问题,例如在上一个请求正在进行时禁用选择?
更新
为了解决this Vaadin bug,我还调用setPageSize(),并使用确切的项目数作为参数。不过好像我不打电话setPageSize()也会出现同样的问题,所以很可能是setItems()造成的。
【问题讨论】:
-
问题可能来自您拨打
setItems(..)。也可能来自 pageSize 的东西,idk。我个人会重新考虑重新设置项目是否是在 selectionListener 中做的正确事情。理论上,您可以通过首先在 selectionListener 中生成一个后台线程来解决您的问题,并通过使用 ui.access(..) 禁用整个网格来禁用选择。然后将执行此操作,而无需等待整个侦听器完成。 -
@kscherrer 选择一个项目时,它必须在 DB 中更新并反映在网格中,对于某些项目,当取消选择它们时,它们必须从 DB 和网格中删除。这是所需的功能。所以在数据库操作之后我刷新了网格。有没有更合适的方法来实现这种行为?感谢您使用后台线程的建议,但我希望有一种更清洁的方法。我现在很确定它来自 pageSize,重置会导致键被刷新。
-
@kscherrer 好的,即使没有调用
setPageSize,键似乎也已刷新。所以这是由于setItems(...) -
你可以等到用户点击一个按钮,例如“保存选定的项目”。这听起来也有点像你可以为你想要的功能做你自己的专栏。添加一个带有 Checkbox 的列,然后您有一个 valueChangeListener 可以将内容保存到 DB 中。
-
您是否使用选择状态来定义项目的布尔字段?
标签: vaadin vaadin-flow vaadin-grid vaadin10