Angular 4应用程序.
我正在尝试创建一个错误页面,以显示有关可能发生的未处理异常的一些信息. GlobalErrorHandler拦截最终错误并将用户重定向到由单个ErrorComponent组成的页面.发生错误时会显示页面,但不会调用生命周期挂钩.
ErrorHandler:
@Injectable() export class GlobalErrorHandler extends ErrorHandler { constructor( private injector: Injector ) { // The true paramter tells Angular to rethrow exceptions,so operations like 'bootstrap' will result in an error // when an error happens. If we do not rethrow,bootstrap will always succeed. super(true); } handleError(error: any) { const router = this.injector.get(Router); if (!router.url.startsWith('/error')) { router.navigate(['/error']); } super.handleError(error); } }
ErrorComponent:
@Component({ selector: 'error-desc',template: '<h1>Error page = {{code}}</h1>' changeDetection: ChangeDetectionStrategy.OnPush }) export class ErrorComponent implements OnInit { public code: string = ''; constructor( ) {} ngOnInit() { // not called this.code="AAAA"; console.log("OnInit"); } ngOnDestroy() { console.log("OnDestroy"); } }
plunkr的工作演示.
解决方法
找到
this github issue.看起来你只需要在angular的区域内运行你的router.navigate(…)代码来启动和运行重定向:
ErrorHandler:
@Injectable() export class GlobalErrorHandler extends ErrorHandler { constructor(private injector: Injector private zone: ngzone) { super(); } handleError(error: any) { const router = this.injector.get(Router); super.handleError(error); if (!router.url.startsWith('/error')) { this.zone.run(()=>router.navigate(['/error'])); } } }