Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Vaadin流中的视图之间导航时调整URL查询参数_Vaadin_Vaadin Flow - Fatal编程技术网

在Vaadin流中的视图之间导航时调整URL查询参数

在Vaadin流中的视图之间导航时调整URL查询参数,vaadin,vaadin-flow,Vaadin,Vaadin Flow,我很好奇:当以一般方式从一个视图导航到另一个视图时,是否有可能更改URL查询参数 我的用例是什么?在从视图a导航到视图C时,我想在URL中附加一个查询参数“referer”。在从视图B导航到视图C时也应该这样做。视图C打开后,会有一些操作返回到上一个视图。然后,可以通过“referer”URL查询参数确定此“previous view”信息。举个具体的例子,这已经在起作用了 此外,我想在视图类上添加一些注释来泛化该行为。例如,视图A和B用my@ReferrerSource注释,视图C用my@Re

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

我的用例是什么?在从视图a导航到视图C时,我想在URL中附加一个查询参数“referer”。在从视图B导航到视图C时也应该这样做。视图C打开后,会有一些操作返回到上一个视图。然后,可以通过“referer”URL查询参数确定此“previous view”信息。举个具体的例子,这已经在起作用了

此外,我想在视图类上添加一些注释来泛化该行为。例如,视图A和B用my
@ReferrerSource
注释,视图C用my
@ReferrerTarget
注释。因此,每次在我的应用程序中进行导航时,我都会考虑这些视图注释,并根据需要添加“引用者”URL查询参数。
这可能吗?

参考源代码视图:
离开视图导航时,可以使用方法
UI.getCurrent().navigate(字符串位置,QueryParameters QueryParameters)

或者,如果使用
RouterLink
进行导航,也可以在那里设置查询参数:
RouterLink.setQueryParameters(QueryParameters QueryParameters)

这不是通过注释或接口可以完成的,因为它不能在任何类型的导航观察器中完成。最佳情况下,您应该能够将referer queryParameter添加到BeforeLeaveEvent之前的
,但我认为您还不能这样做(您可以从中获取queryParameter,但不能在那里编辑它们)


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

@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
}
@覆盖
公共无效afterNavigation(AfterNavigationEvent事件){
映射参数=afterNavigationEvent.getLocation().getQueryParameters().getParameters();
//TODO:检查referer参数的参数,并将其保存在视图中
}


另一种可能的解决方案是不使用QueryParameters,而是将以前的视图保存在UI范围中(就像您最近在;p中建议的那样)。现在,对于Vaadin 14,我真的不确定它是如何工作的,因为UI实例是在导航时重建的。但我相信有一个很好的解决方案,关于这个话题,在Sao、vaadin论坛和vaadin github上有很多讨论。

你试过吗?然而,这听起来很像浏览器回溯或历史api的复杂方式?是的,我尝试了导航事件,但据我所见,它们不提供在导航时更改URL查询参数的可能性。浏览器返回可以工作,但感觉奇怪:考虑查看C是一个编辑视图和行动A“保存”。“保存”将保留对象并在浏览器历史记录中向后移动。浏览器历史记录中的“前进”导航将返回到“编辑”视图。感觉不寻常。同意。这些是解决我问题的选择。为了将您的想法与基于注释的方法结合起来,我创建了自己的导航助手类,该类有两种方法:第一种是从referer导航到目标(检查referer视图类上的
@referersource
注释),第二种是从目标导航到referer(检查目标视图类上的
@refererTarget
注释)。感谢您的回答。关于UI范围:据我所知,UI实例仅在导航未通过
RouterLink
UI.getCurrent().导航
方法或浏览器历史记录时重建。其他导航如按F5(未设置@PreserveOnRefresh)在浏览器中,通常的链接或直接在浏览器中调用URL将触发新的UI实例。相关:显然,这与vaadin 17有关