Angular 角度路由器模块ActivatedRoute存在时返回null firstChild
遵循托德格言的一个优秀指南()我遇到了一个无法解释的情况 下面是一些代码:Angular 角度路由器模块ActivatedRoute存在时返回null firstChild,angular,angular-routing,angular-router,Angular,Angular Routing,Angular Router,遵循托德格言的一个优秀指南()我遇到了一个无法解释的情况 下面是一些代码: this.router.events .filter((event) => event instanceof NavigationStart) .map(() => this.activatedRoute) .map((route) => { console.log('route pre-while: ', route); // Shows ActivatedRo
this.router.events
.filter((event) => event instanceof NavigationStart)
.map(() => this.activatedRoute)
.map((route) => {
console.log('route pre-while: ', route); // Shows ActivatedRoute object
console.log('pre-while route child: ', route.firstChild); // null
while (route.firstChild) {
console.log('while route: ', route);
route = route.firstChild;
}
console.log('post while route: ', route);
return route;
})
.subscribe((elem) => {
console.log('elem: ', elem);
});
在这个代码块中,“route pre while”log语句在Chrome控制台中显示一个ActivatedRoute对象。如果我在Chrome的控制台窗口中展开该对象,我可以单击
firstChild
属性并看到另一个ActivatedRoute
对象,这与我预期的一样。但是,问题是,第二个日志语句“pre while route child”将null
输出到控制台。此外,WHILE循环从不执行,因为route.firstChild
的计算结果为null
。谁能给我解释一下这是为什么???为什么我可以记录对象并看到一个firstChild
,但在尝试访问它时立即得到null?因此,实际的路由器事件很重要。拦截NavigationStart事件没有足够的时间填充ActivatedRoute对象。现在太早了。拦截NavigationEnd似乎是一张罚单,因为那时所有路线的评估和装载都已经完成。感谢您提出这个问题并自己找出解决方案
对于将来登陆这里的人们来说,这将是有效的解决方案
从'@angular/Router'导入{Router,NavigationEnd};
.
.
建造师(
...
专用路由:ActivatedRoute){
}
.
.
这是路由器事件
.filter((事件)=>NavigationEnd的事件实例)
.map(()=>this.activatedRoute)
.map((路线)=>{
console.log('route pre-while:',route);//显示ActivatedRoute对象
console.log('pre-while route child:',route.firstChild);//null
while(route.firstChild){
log('while route:',route);
route=route.firstChild;//如果场景中需要,则为有条件
}
log('post while route:',route);
返回路线;
})
.订阅((元素)=>{
log('elem:',elem);
});
my bad,我看到你为我删除了它。不用担心,只是想确保你明白为什么。当尝试使用Angular 10执行上述操作时,tslint说:“Observable”类型上不存在属性“filter”