angular 2 router.events 订阅未触发
angular 2 router.events subscription not firing
我正在使用订阅 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);
});
}
单击带有 routerLink 属性 的 link 时,订阅会发出值并且工作正常。
我将我的项目与一个使用 Augury 的工作项目进行了比较,在面包屑组件中,路由器的状态如下所示:Not working Router
而工作的:Working router
如果您需要更多信息来帮助我,请联系我:)
提前致谢!
您的代码正在通过订阅异步加载数据。我建议把它放在 constructor() 中,这样它会在生命周期钩子之前执行,也就是在 OnInit() 之前执行,并且在你点击 link 之前加载数据。这是对的。
因此,更仔细地查看 Observables 以更好地了解正在发生的事情。
在 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')
}
您将在控制台上看到路由器事件在打印 'ngOnInit' 之前打印在控制台上。所以订阅路由器事件的正确位置是构造函数。
我正在使用订阅 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);
});
}
单击带有 routerLink 属性 的 link 时,订阅会发出值并且工作正常。 我将我的项目与一个使用 Augury 的工作项目进行了比较,在面包屑组件中,路由器的状态如下所示:Not working Router
而工作的:Working router
如果您需要更多信息来帮助我,请联系我:) 提前致谢!
您的代码正在通过订阅异步加载数据。我建议把它放在 constructor() 中,这样它会在生命周期钩子之前执行,也就是在 OnInit() 之前执行,并且在你点击 link 之前加载数据。这是对的。 因此,更仔细地查看 Observables 以更好地了解正在发生的事情。
在 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')
}
您将在控制台上看到路由器事件在打印 'ngOnInit' 之前打印在控制台上。所以订阅路由器事件的正确位置是构造函数。