【发布时间】:2021-03-25 11:39:58
【问题描述】:
我正在开发 Vaadin 14 应用程序。我希望用户能够转到某个 URL,并根据某些条件重新路由到具有自己路由的多个视图之一。
我知道如何使用 BeforeEnterHandler / BeforeEnterObserver 重新路由。但这仅适用于中断对已知路线的导航,据我所知,该路线需要链接到实现Component 的类,方法是使用@Route 作为该类的注释或动态注册。这是否意味着我需要使用此路由创建一个虚拟的Component 实现,它永远不会显示,只是为了能够在BeforeEnterHandler 中重新路由?或者是否有一些更简洁的方法可以在查找相应的视图组件之前挂钩到路由生命周期并重新路由?
更新:
我写这个问题时考虑到了重新路由,但我发现我将使用转发代替,因为forwardTo 也会更新浏览器 URL,这就是我想要的。但问题还是一样的,因为我仍然需要一个能够转发到另一个路由的路由。
更新 2:
由于我需要为目标视图提供查询参数,我什至不能使用forwardTo。 UI.navigate 在导航期间调用时显然无法正常工作,因此我需要处理AfterNavigationEvent 并在那里调用UI.navigate。这意味着此时导航已经完成,所以我的路线肯定需要Component 作为导航目标。这两个问题(如果不创建虚拟 UI 组件就无法处理路由,forwardTo 不接受查询参数)似乎是 Vaadin 框架路由支持的基本缺点。
【问题讨论】:
-
如果在离开前一个视图时无法完成条件逻辑(-> 如果您的虚拟视图是用户进入应用程序的入口点),那么具有重新路由逻辑的虚拟视图听起来像这样去。我不知道有任何直接的路由器干预来实现你想要的,所以我的回答是继续你的计划。但我很可能是错的,所以我不会把它写成一个实际的答案。确实有一种方法可以避免虚拟视图。在 Java 中,您可以使用
UI.getCurrent().getRouter()访问路由器,但我找不到不使用Component来添加路由的方法。 -
@kscherrer 实际上这条路线应该是一个应用程序入口点。事实上,我个人认为任何视图都应该是可收藏的,因此可以直接访问,就好像它是一个入口点一样。
-
我的措辞很糟糕。您将 URL 提供给用户就是应用程序入口点的定义。这就是为什么您不能在前一个视图中使用
BeforeLeaveObserver来执行您的自定义条件逻辑(因为没有前一个视图)。你不会绕过创建一个虚拟组件。 -
@kscherrer 好的。似乎即使是一个虚拟组件也不允许我做我想做的事,因为我的目标 URL 具有查询参数,并且
BeforeEnterEvent上没有接受查询参数的forwardTo方法:(
标签: vaadin vaadin-flow