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'])); } } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。