角度报告当前路线和参数到任何组件?

问题描述

我真的不知道为什么这么难...为什么我们正式不应该在乎路由组件内部任何地方的路由...。但是:

我试图将服务写到我的标头(和其他任何组件)可以知道当前的路由和参数。也很高兴知道当前加载的组件,但这并不重要。

我尝试了this thread的各种解决方案,而让我最接近的是RoyiNamir的释义,但是正如您从所附的stackblitz中所看到的那样,尽管它仅在页面加载时报告该参数,尽管随后的导航却没有订阅和NavigationEnd的存在(尽管我在解释路由事件以及rxjs时也承认是超级绿色)。

我也不确定如何在返回的对象中传递当前路线以及参数。

代码

{{1}}

Working stackblitz

解决方法

如果您像这样修改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事件之前

StackBlitz