如何解决Vaadin 19.0.6 网格项目详细信息在使用 @UIScope 导航回视图时卡住
我有一个带有单选网格的视图,它具有自定义项目详细信息渲染器。视图有@UIScope 注释。
详细信息打开/关闭存在问题。要重现它,您必须离开视图然后返回到它(无论如何。使用浏览器后退按钮或使用 vaadin 路由器导航)。
第一种情况是当 setDetailsVisibleOnClick(true) 时,您最终可能会打开或关闭详细信息。例如,我第一次导航回来时,打开了详细信息。然后我重复导航和返回查看,这次关闭了详细信息。
第二种情况,当我有 setDetailsVisibleOnClick(false) 并使用 setDetailsVisible 为项目实现单击侦听器时。此外,我在 onAttach 方法中设置 selectedItem 变量添加然后选择(selectedItem)和 setDetailsVisible(selectedItem,true)。 现在,当我导航回去查看项目被选中并打开详细信息时。但是,当我选择其他项目时,记住的项目详细信息保持打开状态。 实际上,对于 setDetailsVisibleOnClick(true) 的第一种情况也是如此。如果您返回查看并打开了详细信息,那么在您单击其他网格项后它们将保持打开状态。
@Override
public void onAttach(AttachEvent event) {
//https://github.com/vaadin/vaadin-grid/issues/1850
setDetailsVisibleOnClick(true);
setDetailsVisibleOnClick(false);
if (selectedItem != null) {
select(selectedItem);
if (detailsRenderer != null) setDetailsVisible(selectedItem,true);
scrollToIndex(dataProvider.getItems().indexOf(selectedItem));
}
}
和 SingleSelectionListener
event -> {
var item = event.getSelectedItem().orElse(null);
if (detailsRenderer != null) {
var oldVal = event.getOldValue();
if (selectedItem != null) setDetailsVisible(selectedItem,false);
if (oldVal != null) setDetailsVisible(oldVal,false);
if (item != null) setDetailsVisible(item,true);
getElement().executeJs("this.notifyResize()");//preserve rows heights on grid container resize
}
selectedItem = event.getSelectedItem().orElse(null);
}
解决方法
我设法解决了这个问题。在我的 Grid 扩展类中:
public void restoreSavedSelection() {
var items = dataProvider.getItems();
if (selectedItem != null && !items.isEmpty() && items.contains(selectedItem)) {
var index = items.indexOf(selectedItem);//workaround
select(items.get(index));
scrollToIndex(index);
}
}
@Override
public void scrollToIndex(int rowIndex) {
getElement().executeJs("setTimeout(function() { $0.scrollToIndex($1) })",getElement(),rowIndex);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。