【问题标题】:Vaadin 14 re-routingVaadin 14 重新路由
【发布时间】:2021-03-25 11:39:58
【问题描述】:

我正在开发 Vaadin 14 应用程序。我希望用户能够转到某个 URL,并根据某些条件重新路由到具有自己路由的多个视图之一。

我知道如何使用 BeforeEnterHandler / BeforeEnterObserver 重新路由。但这仅适用于中断对已知路线的导航,据我所知,该路线需要链接到实现Component 的类,方法是使用@Route 作为该类的注释或动态注册。这是否意味着我需要使用此路由创建一个虚拟的Component 实现,它永远不会显示,只是为了能够在BeforeEnterHandler 中重新路由?或者是否有一些更简洁的方法可以在查找相应的视图组件之前挂钩到路由生命周期并重新路由?

更新: 我写这个问题时考虑到了重新路由,但我发现我将使用转发代替,因为forwardTo 也会更新浏览器 URL,这就是我想要的。但问题还是一样的,因为我仍然需要一个能够转发到另一个路由的路由。

更新 2: 由于我需要为目标视图提供查询参数,我什至不能使用forwardToUI.navigate 在导航期间调用时显然无法正常工作,因此我需要处理AfterNavigationEvent 并在那里调用UI.navigate。这意味着此时导航已经完成,所以我的路线肯定需要Component 作为导航目标。这两个问题(如果不创建虚拟 UI 组件就无法处理路由,forwardTo 不接受查询参数)似乎是 Vaadin 框架路由支持的基本缺点。

【问题讨论】:

  • 如果在离开前一个视图时无法完成条件逻辑(-> 如果您的虚拟视图是用户进入应用程序的入口点),那么具有重新路由逻辑的虚拟视图听起来像这样去。我不知道有任何直接的路由器干预来实现你想要的,所以我的回答是继续你的计划。但我很可能是错的,所以我不会把它写成一个实际的答案。确实有一种方法可以避免虚拟视图。在 Java 中,您可以使用 UI.getCurrent().getRouter() 访问路由器,但我找不到不使用 Component 来添加路由的方法。
  • @kscherrer 实际上这条路线应该是一个应用程序入口点。事实上,我个人认为任何视图都应该是可收藏的,因此可以直接访问,就好像它是一个入口点一样。
  • 我的措辞很糟糕。您将 URL 提供给用户就是应用程序入口点的定义。这就是为什么您不能在前一个视图中使用BeforeLeaveObserver 来执行您的自定义条件逻辑(因为没有前一个视图)。你不会绕过创建一个虚拟组件。
  • @kscherrer 好的。似乎即使是一个虚拟组件也不允许我做我想做的事,因为我的目标 URL 具有查询参数,并且 BeforeEnterEvent 上没有接受查询参数的 forwardTo 方法:(

标签: vaadin vaadin-flow


【解决方案1】:

在我看来,使用 route 是最简洁的方式,它与框架中的概念保持一致——任何“监听”URL 的(在 Vaadin 中)都是路由。您可以使用@Route 定义路由,或者如果有帮助,您可以使用RouteConfiguration 动态注册它们。另一种选择是使用 Servlet 重定向到所需的视图,但我认为这并不干净。

【讨论】:

  • 确实定义路由是最干净的,但是除了创建视图组件之外似乎没有其他方法可以定义路由。 @Route 不适用于普通类,RouteConfiguration.setRoute(...) 需要 Class<? extends Component> 参数。所以看起来需要一个虚拟组件。
  • 仅供参考,我已经为 Vaadin 路由支持的两个问题创建了 github.com/vaadin/flow/issues/10419github.com/vaadin/flow/issues/10420。我会在接受答案之前稍等片刻,以防万一来自 Vaadin 的其他人提出更好的解决方案。
  • 感谢您报告问题。如果答案有用,请您将其标记为已接受吗?
  • 好的,我想简短的回答是目前没有干净的方法,你必须创建一个虚拟组件来处理路由,或者使用 servlet/filter。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-14
  • 1970-01-01
  • 2020-03-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-24
相关资源
最近更新 更多