问题描述
我真的不知道为什么这么难...为什么我们正式不应该在乎路由组件内部任何地方的路由...。但是:
我试图将服务写到我的标头(和其他任何组件)可以知道当前的路由和参数。也很高兴知道当前加载的组件,但这并不重要。
我尝试了this thread的各种解决方案,而让我最接近的是RoyiNamir的释义,但是正如您从所附的stackblitz中所看到的那样,尽管它仅在页面加载时报告该参数,尽管随后的导航却没有订阅和NavigationEnd的存在(尽管我在解释路由事件以及rxjs时也承认是超级绿色)。
我也不确定如何在返回的对象中传递当前路线以及参数。
代码:
{{1}}
解决方法
如果您像这样修改getActivatedRouteParameter
,似乎效果很好:
public getActivatedRouteParameter(): Observable<any>
{
let params
params = this.router.events.pipe(
filter(e => e instanceof NavigationEnd),map((): ActivatedRoute => {
let route = this.route;
while (route.firstChild)
{
route = route.firstChild;
}
return route;
}),filter((route: ActivatedRoute) => route.outlet === 'primary'),switchMap((route: ActivatedRoute) => route.paramMap.pipe(first())),/* first() */
tap(console.log)
);
return params;
}
在first()
中添加switchMap
外,这将导致整个流在第一次发射后完成,这将是一个空对象(自ActivatedRoute
's properties are BehaviorSubjects
以来):
function createActivatedRoute(c: ActivatedRouteSnapshot) {
return new ActivatedRoute(
new BehaviorSubject(c.url),new BehaviorSubject(c.params),new BehaviorSubject(c.queryParams),new BehaviorSubject(c.fragment),new BehaviorSubject(c.data),c.outlet,c.component,c);
}
通过将first()
添加到switchMap
的内部可观察对象中,您不会得到重复。否则,您会得到重复,因为在您的情况下,每个路线导航都会使用相同的组件(HomeComponent
),这意味着它不会被破坏,因此ActivatedRoute
将相同,其可观察属性也将如此。
这也意味着内部的可观察对象将不会完成,因此当ActivatedRoute
将被重用时,它将update its BehaviorSubject
instances。
...
if (!shallowEqual(currentSnapshot.params,nextSnapshot.params)) {
(<any>route.params).next(nextSnapshot.params);
}
...
这发生在管道中的更早位置,在NavigationEnd
事件之前。