Vaadin 14:如何在不关闭Dialog的前提下从Dialog中打开后台页面
Vaadin 14 模态框保持打开状态下触发页面导航的实现方案
你的核心问题是将导航逻辑绑定到了对话框的卸载事件上,才会必须关闭弹窗才能触发导航,直接把导航逻辑绑定到表格的交互事件上即可,具体实现方式如下:
实现步骤
- 绑定表格交互事件
直接给弹窗内的表格添加行点击/选中监听,在回调中直接执行导航逻辑,不需要调用弹窗的close()方法。如果是单击行选中的场景,用ItemClickListener即可:
// 弹窗内部的表格组件添加点击监听 grid.addItemClickListener(event -> { // 从选中行获取参数 String canFileNumber = String.valueOf(event.getItem().getCanFileNumber()); // 直接执行导航逻辑 UI.getCurrent().navigate(AssignmentPageContainer.class, canFileNumber); });
如果是多选场景需要选中后触发,改用SelectionListener:
grid.addSelectionListener(event -> { event.getFirstSelectedItem().ifPresent(vehicle -> { String canFileNumber = String.valueOf(vehicle.getCanFileNumber()); UI.getCurrent().navigate(AssignmentPageContainer.class, canFileNumber); }); });
- 调整弹窗挂载层级(可选,解决导航后弹窗消失问题)
如果执行导航后弹窗还是被关闭,是因为你的弹窗挂载到了父页面的组件树中,导航时父页面被卸载连带弹窗被移除。只需要修改弹窗的挂载方式,直接挂在UI根节点即可:
// 不要将弹窗add到父页面的子组件中,改用以下方式挂载 UI.getCurrent().add(vehicleInfoPopUpView); vehicleInfoPopUpView.open();
替代方案(无路由跳转场景)
如果不需要修改页面路由,只是需要替换当前父页面的展示内容,可以直接动态替换父页面内容容器的组件,完全不会影响弹窗状态:
// 假设你父布局有一个id为contentContainer的内容容器 Optional<Component> contentOpt = UI.getCurrent().getChildren() .filter(component -> "contentContainer".equals(component.getId().orElse(""))) .findFirst(); contentOpt.ifPresent(container -> { ((HasComponents) container).removeAll(); ((HasComponents) container).add(new AssignmentPageContainer(canFileNumber)); });
内容的提问来源于stack exchange,提问作者Prashant Kumar
相关产品推荐
相关产品推荐

