ngOnInit 不在错误页面组件上运行

Posted

技术标签:

【中文标题】ngOnInit 不在错误页面组件上运行【英文标题】:ngOnInit does not run on error page component 【发布时间】:2018-02-27 00:21:38 【问题描述】:

Angular 4 应用程序。

我正在尝试创建一个错误页面,以显示有关可能发生的未处理异常的一些信息。 GlobalErrorHandler 拦截最终错误并将用户重定向到由单个 ErrorComponent 组成的页面。发生错误时会显示页面,但不会调用生命周期挂钩。

错误处理程序

@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); 
    


错误组件

@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 上的工作演示。

我该如何解决这个问题?也许有人知道解决方法? 谢谢

【问题讨论】:

请输入您的代码 代码在planker中。见描述中的链接 @Albert 我从 4.1 升级到 4.4 后遇到了同样的问题。顺便说一句,您应该在问题中包含代码,而不是外部网站,请参阅 How to ask a good question :“如果可以创建可以链接到的问题的实时示例(例如,在 sqlfiddle.com 或jsbin.com) 然后这样做 - 但也要在您的问题本身中包含代码。不是每个人都可以访问外部网站,并且链接可能会随着时间的推移而中断。" 有一个 issue 关于这个问题。 @n00dl3,你是对的,这是我对相关代码的疏忽。以后我会更加注意。谢谢 【参考方案1】:

找到this github issue后。看来您只需在 angular 区域内运行 router.navigate(...) 代码即可启动并运行重定向:

错误处理程序:

@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']));
        
    


【讨论】:

有趣,handleError 方法在 zone 之外运行 我在收到来自PayPal Checkout 的付款并将用户重定向到成功页面时遇到了同样的问题...无论如何,在 angular 的NgZone 内运行router 解决了我的问题...谢谢!

以上是关于ngOnInit 不在错误页面组件上运行的主要内容,如果未能解决你的问题,请参考以下文章

Angular5服务调用在ngOnInit上不起作用

PHP mysqli 在命令行中工作,但不在页面上

server2008物理内存使用82%导致程序内存错误

如何在离子页面上触发 ngOnInit

Vue-router 不在页面上显示组件

组件在 NgOnInit 完成之前渲染?