有一种使用辅助路线的解决方法,因为Angular会在主要路线导航中保留这些辅助路线。
首先,在顶部组件中添加一个命名的路由器插座:
<router-outlet name="params"><router-outlet>
接下来,创建一个虚拟组件以路由到:
@Component({
template: ""
})
export class ParamsComponent {}
并定义一条路径以将该组件实例化到命名插座中:
{
path: ':val1',
component: ParamsComponent,
outlet: "params"
}
将您的应用导航更改为:
https://my.application.com/(params:val1)
如果您查看任何ActivatedRoute,则可以使用以下命令找到“ params”路由:
var paramsRoute = this.activatedRoute.route.children.find(r => r.outlet == "params");
如果paramsRoute为null,则网址不包含(params:val1)。
由于在初始负载下的主路由之后实例化了辅助路由,因此下一部分会有点“ hacky”。因此,在应用程序完全加载之前,您可能会发现paramsRoute.snapshot为null。有一个私有属性“ _futureSnapshot”,它将包含初次启动时的路由参数...并在应用程序的整个生命周期中持续存在。您可以使用以下方法获得这些信息:
var queryParams =
paramsRoute
? paramsRoute["_futureSnapshot"].params
: {};
var val1 = queryParams["val1"];
鉴于_futureSnapshot不是公共API的一部分,所以这可能是我们不应该使用的字段。如果您觉得它很讨厌,则可以订阅paramsRoute.params,但这可能会使您的组件复杂化。
if (paramsRoute) {
paramsRoute.params.subscribe(params => {
this.queryParams = params;
this.loadData();
});
} else {
this.queryParams = {};
this.loadData();
}
=========修改=============
我找到了一种更好的拉取查询参数的方法,它绝对不是棘手的……在路由发生之前实例化的组件或服务中,添加以下逻辑:
const routeRecognizedSubscription = this.router.events
.filter(e => e instanceof RoutesRecognized)
.subscribe((e: RoutesRecognized) => {
const paramsRoute = e.state.root.children.find(r => r.outlet == "params");
if (paramsRoute) {
// capture or use paramsRoute.params
}
routeRecognizedSubscription.unsubscribe();
});
此代码临时订阅导航之前发生的RoutesRecognized事件。收到第一个事件后,它将自动退订,因为只有在应用启动时才需要这样做。
在第一个事件中,我们寻找与“ params”出口相对应的状态。如果找到,params属性将包含我们需要的数据。无需访问私有财产。