微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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 举报,一经查实,本站将立刻删除。

相关推荐