【问题标题】:Adapting URL query parameters when navigating between views in Vaadin Flow在 Vaadin Flow 中的视图之间导航时调整 URL 查询参数
【发布时间】:2023-03-13 08:31:01
【问题描述】:

我很好奇:以通用方式从一个视图导航到另一个视图时,是否有可能更改 URL 查询参数?

我的用例是什么?当从视图 A 导航到视图 C 时,我想在 URL 中附加一个查询参数“referrer”。从视图 B 导航到 C 时也应该这样做。一旦视图 C 打开,有一些操作应该返回以前的看法。然后可以通过“referrer” URL 查询参数来确定此“先前视图”信息。举个具体的例子,这已经奏效了。

此外,我想通过视图类上的一些注释来概括行为。例如。视图 A 和 B 用我的 @ReferrerSource 注释,视图 C 用我的 @ReferrerTarget 注释。因此,每次在我的应用程序中进行导航时,我都会考虑这些视图注释并按需添加“referrer”URL 查询参数。

这可能吗?

【问题讨论】:

  • 你试过vaadin.com/docs/v14/flow/routing/… 吗?然而,这听起来很像浏览器返回或历史 API 的复杂方式?
  • 是的,我尝试了导航事件,但据我所知,它们无法在导航时更改 URL 查询参数。浏览器返回可以工作,但感觉很奇怪:将视图 C 视为编辑视图,将操作视为“保存”。 “保存”将保留对象并移回浏览器历史记录。浏览器历史中的“前进”导航将返回到编辑视图。感觉很不寻常。

标签: vaadin vaadin-flow


【解决方案1】:

Referrer Source View:
离开视图时,您可以使用方法UI.getCurrent().navigate(String location, QueryParameters queryParameters)
或者如果您使用RouterLink 进行导航,您也可以在此处设置查询参数:routerLink.setQueryParameters(QueryParameters queryParameters)

这不是可以通过注解或接口完成的事情,因为它不能在任何类型的导航观察者中完成。理想情况下,您应该能够将引荐来源网址 queryParameter 添加到 BeforeLeaveEvent,但我认为您还不能这样做(您可以从中获取 QueryParameters,但不能在那里进行编辑)。


推荐人目标视图:
您可以从引用目标视图中的 beforeEnterEvent 或 afterNavigationEvent 读取 url 参数。您可以将引用值存储在视图的字段中,并在用户按下“上一个视图”按钮时使用它。我不确定你如何通过注释来做到这一点,但如果你愿意的话,它应该可以通过接口来实现。

@Override
public void afterNavigation(AfterNavigationEvent event) {
    Map<String, List<String>> parameters = afterNavigationEvent.getLocation().getQueryParameters().getParameters();
    // TODO: check parameters for your referrer parameter, and save it in the view
}

另一种可能的解决方案是单独保留 QueryParameters,并将前一个视图保存在 UI 范围内(就像您最近在 one of your own answers 中建议的那样;P)。现在,从 Vaadin 14 开始,我真的不确定这是如何工作的,因为 UI 实例是在导航时重建的。但我确信有一个很好的解决方案,在 SO、vaadin 论坛和 vaadin github 上有很多关于这个主题的讨论。

【讨论】:

  • 同意。这些是解决我的问题的选项。为了将您的想法与基于注释的方法相结合,我创建了自己的导航帮助程序类,该类具有两种方法:第一种是从引用者导航到目标(检查引用者视图类上的 @ReferrerSource 注释),其次是从目标导航回引用者(检查目标视图类上的@ReferrerTarget 注释)。感谢您的回答。
  • 关于 UI 范围:据我所知,只有在没有通过 RouterLinkUI.getCurrent().navigate 方法或浏览器历史记录完成导航时,才会重建 UI 实例。其他导航,如在浏览器中按 F5(未设置 @PreserveOnRefresh 时)、常用链接或直接在浏览器中调用 URL 将触发新的 UI 实例。
  • 相关:github.com/vaadin/flow/issues/8712 显然这会随着 vaadin 17 而改变
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多