Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 角度9-OnSameurNavigation=&x27;重新加载';不触发路由器事件_Angular_Angular Routing_Angular9 - Fatal编程技术网

Angular 角度9-OnSameurNavigation=&x27;重新加载';不触发路由器事件

Angular 角度9-OnSameurNavigation=&x27;重新加载';不触发路由器事件,angular,angular-routing,angular9,Angular,Angular Routing,Angular9,我的Angular 9应用程序有一个CustomErrorHandler和一个ErrorPageComponent。当在整个应用程序中引发任何异常时,CustomErrorHandler将告诉路由器导航到ErrorPageComponent。但是,ErrorPageComponent中有一个按钮,它可以抛出自己的异常,在这种情况下,我希望CustomErrorHandler仍然告诉路由器导航到ErrorPageComponent,这是正常的。但是,当ErrorPageComponent以这种方式

我的Angular 9应用程序有一个CustomErrorHandler和一个ErrorPageComponent。当在整个应用程序中引发任何异常时,CustomErrorHandler将告诉路由器导航到ErrorPageComponent。但是,ErrorPageComponent中有一个按钮,它可以抛出自己的异常,在这种情况下,我希望CustomErrorHandler仍然告诉路由器导航到ErrorPageComponent,这是正常的。但是,当ErrorPageComponent以这种方式路由到自身时,它需要再次调用其初始化方法

通常,如果希望组件在路由到自身后调用初始化方法,只需订阅路由事件即可。然后,只要您正确地将OnNameUrlNavigation设置为重新加载,当组件导航到自身时,路由器将触发路由事件,并将调用组件用于订阅它的任何回调方法

但是,当我的CustomErrorHandler告诉路由器导航到ErrorPageComponent时,不会触发任何路由事件

如果您查看代码,这将更有意义:

以下是app-routing.module.ts中的我的路线配置:

const routes:routes=[
{path:'normal',component:NormalComponent},
{路径:'',重定向到:'/normal',路径匹配:'full'}
];
常数volitileRoutes:路由=[
{路径:“错误”,组件:ErrorPageComponent}
];
常量后备路线:路线=[
{路径:'**',组件:Error404PageComponent}
];
@NGD模块({
进口:[
路由模块forRoot(路由),
forRoot(volitileRoutes,{onNameUrlNavigation:'reload'}),//我已经正确设置了onNameUrlNavigation
RouterModule.forRoot(fallbackRoute)
],
导出:[路由模块]
})
导出类AppRoutingModule{}
以下是CustomErrorHandler,它将重定向到ErrorPageComponent:

@可注入({
providedIn:'根'
})
导出类CustomErrorHandler扩展了ErrorHandler{
构造器(专用ngZone:ngZone,专用路由器:路由器){
超级();
}
handleError(错误:任意){
//这里的错误处理代码
console.log('error capture');//我已经确认CustomErrorHandler实际上正在处理错误。
/*这不是正常的导航方式。但由于我不理解的原因,这
是让导航在ErrorHandler中工作的唯一方法;您不能简单地
在ErrorHandler中调用router.navigate,像正常一样导航*/
this.ngZone.run(()=>this.router.navigate(['/error']);
}
}
最后,这里是ErrorPageComponent:

@组件({
选择器:“应用程序错误页”,
templateUrl:'./错误页.component.html',
样式URL:['./错误页.component.css']
})
导出类ErrorPageComponent实现OnInit、OnDestroy{
私有订阅=新订阅();
构造函数(专用路由器:路由器){}
ngOnInit():void{
this.navSubscription=this.router.events.subscribe((e:any)=>{
console.log('route event triggered');//从未到达此行
if(导航结束的实例){
//执行初始化代码
}
});
}
ngOnDestroy():void{
this.navSubscription?.unsubscripte();//这可以防止内存泄漏
}
}

正如我在代码注释中提到的,我已经确认CustomErrorHandler正确地处理了错误,并且正在调用路由器导航方法。但是,从未调用传递给路由器导航事件的订阅回调方法。我做错了什么?如何订阅ErrorPageComponent中的路由事件?

您是否尝试先重定向到虚拟位置,然后重定向到实际组件

this.router.navigateByUrl('/', {skipLocationChange: true}).then(()=>
     this.router.navigate(['/error'])
);
我建议您将第一个位置设置为具有ngOnInit和Ngondestory的位置,这些位置没有执行很多操作,因为这将在路由到新位置之前等待init和destroy

这样做您就不需要使用
onSameUrlNavigation
,我认为这样做更好,因为您不需要使用订阅,因此可以销毁订阅,您不必设置
onSameUrlNavigation
,只要使用简单的函数即可在需要时重新加载


但是如果您想使用订阅,请将其移动到构造函数中,而不是移动到
ngOnInit
函数中。

您能创建一个StackBlitz演示吗?嘿,谢谢!这正是我需要的。虽然有点奇怪,在Angular中实现如此简单的目标需要两个这样的重定向…是的,我同意你的看法,但一方面OnSameurNavigation不太容易理解和设置,但不需要两个重定向,另一方面我们有一个非常容易理解和使用的选项,但这并不是标准的方法:/所以我认为对于这两种方法来说,在Angular ^^中实现这个简单的操作肯定很奇怪。奇怪的是,没有简单的方法可以做到这一点。你知道为什么我的OnSameurNavigation解决方案不起作用吗?你认为这是一个bug吗?我唯一看到的可能是你的订阅,你有没有试着把它放在你的构造函数上而不是你的ngOnInit方法上?我也有同样的需要,在“父”组件中有一个“子”组件,而实现OnSameurNavigation从来都不起作用,所以我尝试了其他方法,所以我无法在这个概念上给您很多帮助:/n没关系,您的解决方案帮了大忙。谢谢