【问题标题】:Angular 2 New Router: Change / Set Query ParamsAngular 2 新路由器:更改/设置查询参数
【发布时间】:2017-01-16 23:31:33
【问题描述】:

我在/contacts 注册了一个组件,它显示了一个联系人列表。我添加了一个<input [value]="searchString"> 用于过滤显示的列表。


现在我想在 URL 中以查询参数的形式显示 searchString。 (使用新路由器 3.0.0 RC2)

官方文档 (https://angular.io/docs/ts/latest/guide/router.html#!#query-parameters) 展示了如何使用 router.navigate 更改 queryParams。但这似乎很尴尬,因为我只想更改queryParams,而不必知道我目前在哪条路线:router.navigate(['/contacts'], {queryParams:{foo:42}})

(我知道如果我只是更改queryParams,它不会重新加载组件,但这仍然感觉不合适)


经过一些尝试,我发现router.navigate([], {queryParams:{foo:42}}) 有效。这样感觉好多了。

但我仍然不确定这是否是正确的方法。或者如果我错过了一些方法。


如何更改您的queryParams?

【问题讨论】:

  • 那么,如何将搜索查询放在路由参数中,例如您的路由器文件中的/contacts/:search-query,并在您的组件中观察它的变化?
  • 这会有什么不同吗?我也可以观察到queryParams,这不是问题。 ...我目前的组件有大约20个搜索参数,大部分是可选的,有些是相互排斥的。当用户更改任何参数时,显示的列表将被过滤,另外我想在 URL 中反映这些参数更改。 ... 问题只是关于“设置queryParams 的正确方法是什么?” 或“router.navigate([], ...) 是唯一/正确的方法吗?”跨度>
  • 感谢您的回答,它帮助了我。我现在也使用 router.navigate([], { queryParams: { ... }})。

标签: angular angular2-routing


【解决方案1】:

如果您查看路由器类声明,您会发现:

根据提供的命令数组和起点进行导航。 如果没有提供起始路线,则导航是绝对的。

如果导航成功与否,它还会返回带有值的承诺。

navigate(commands: any[], extras?: NavigationExtras): Promise;

commands - 到路由器的命令数组;

extras - 可选参数,用于指定查询参数等附加属性

如果你查看 NavigationExtras 类你会发现你不仅可以为 Router 指定查询参数,还可以设置保留以前的查询参数等。

我使用了这样的导航方法:

this.router.navigate([], {
        queryParams: objectWithProperties,
        relativeTo: this.activeRoute
    });

其中空数组意味着位置不会改变,而在附加功能中,我使用具有属性的对象定义查询参数。

Angular 将该对象解析为如下形式:

siteBasePath/routerDirectory?propertyName=propertyValue

以下是我认为非常有用的更多有用信息和示例:http://vsavkin.tumblr.com/post/145672529346/angular-router

我希望有人会觉得这很有用。

【讨论】:

  • 这很好。唯一的缺点是它不会触发ngOnInit。因此,如果 queryParameter 发生变化并且我们需要进行 api 调用,我们需要监视以路由事件。这是正确的吗?
  • 如果您使用 Observables,您可以在 ngOnInit 中执行此操作。我将在您的原始问题中发布代码:stackoverflow.com/questions/44930868/…
猜你喜欢
  • 2018-04-08
  • 2017-07-07
  • 1970-01-01
  • 2020-01-25
  • 2017-04-03
  • 2017-01-04
  • 2017-05-14
  • 2016-06-07
  • 2016-09-21
相关资源
最近更新 更多