gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:48:04 25 4
gpt4 key购买 nike

Angular 4 应用程序。

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

错误处理程序:

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

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

最佳答案

找到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']));
}
}

}

关于angular - ngOnInit 不在错误页面组件上运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46279704/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com