angular 2 router.events订阅未触发

Jos*_*pez 6 angular2-routing angular

我正在使用一个breadcrumbs组件来订阅router.events.问题是第一次加载组件时,它不会触发订阅.

ngOnInit(): void {
  console.log("oninit beradcumbs");
  this.router.events.filter(event => event instanceof NavigationEnd).subscribe(event => {
    this.breadcrumbs = [];
    let currentRoute = this.route.root,
    url = '';
    do {
      const childrenRoutes = currentRoute.children;
      currentRoute = null;
      childrenRoutes.forEach(route => {
        if (route.outlet === 'primary') {
          const routeSnapshot = route.snapshot;
          url += '/' + routeSnapshot.url.map(segment => segment.path).join('/');
          this.breadcrumbs.push({
            label: route.snapshot.data,
            url:   url
          });
          currentRoute = route;
        }
      });
    } while (currentRoute);
    console.log("Breadcumbs",this.breadcrumbs);
  });
}
Run Code Online (Sandbox Code Playgroud)

单击具有routerLink属性的链接时,订阅将发出值,并且工作正常.我将我的项目与使用Augury的工作项进行了比较,并且在面包屑组件中,路由器的状态如下所示:不工作的路由器

工作的一个:工作路由器

现在让我,如果您需要更多信息帮助:)提前感谢!

Veg*_*ega 11

您的代码通过subscribe异步加载数据.我建议将它放在constructor()中,因此它将在生命周期钩子之前执行,因此在OnInit()之前执行,并且在您单击链接之前将加载数据.哪个是对的.因此,更密切地关注Observables,以便更好地了解正在发生的事情.


小智 5

Angular 9 中也存在生命周期挂钩后不触发路由器订阅事件的情况。根据贡献者this 的说法,无法保证路由器事件与组件生命周期挂钩交错的顺序。

我们可以做一个简单的测试来识别路由器事件何时触发。

constructor(private router: Router) { 
   console.log('constructor')
   this.router.events.pipe(filter(event => 
       event instanceof NavigationEnd)).subscribe((event: NavigationEnd) => {
         console.log(event);
   });
 }

ngOnInit(): void {
  console.log('ngOnInit')
}
Run Code Online (Sandbox Code Playgroud)

您将在控制台上看到,在打印“ngOnInit”之前,路由器事件已打印在控制台上。因此订阅路由器事件的正确位置是构造函数。