gpt4 book ai didi

javascript - Angular 4 + zonejs : routing stops working after uncaught error

转载 作者:数据小太阳 更新时间:2023-10-29 04:49:00 26 4
gpt4 key购买 nike

如果在路由过程中组件(构造函数或 ngOnInit)出现 Uncaught Error ,导航将不再工作。

即使存在全局 ErrorHandler 和 RouterModule 的 ErrorHandler,也会发生这种情况,添加 ZoneListener 以确保 - 参见 app.module.ts

此处的最小示例: https://embed.plnkr.co/L19S3hKWyqgKUIT1EJlI/preview

确保打开控制台。单击“示例组件”后,由于 ExampleFormComponent 中的强制错误,会出现一些堆栈跟踪。之后您将无法导航回“主页”。

如何处理意外的、 Uncaught Error 以确保它们不会破坏整个应用程序?

最佳答案

我会做一些解决方法,例如:

let hasRouterError = false;
@Injectable()
export class MyErrorHandler implements ErrorHandler {
constructor(private inj: Injector) {}

handleError(error: any): void {
console.log('MyErrorHandler: ' + error);

if(hasRouterError) {
let router = this.inj.get(Router);
router.navigated = false;
}

//throw error; // it is necessarily otherwise handleError won't be executed during next error
}
}

export function MyRouterErrorHandler(error: any) {
console.log('RouterErrorHandler: ' + error);
hasRouterError = true;
throw error;
}

而且我们必须使用自定义 RouteReuseStrategy:

export class PreventErrorRouteReuseStrategy implements RouteReuseStrategy {
shouldDetach(route: ActivatedRouteSnapshot): boolean { return false; }
store(route: ActivatedRouteSnapshot, detachedTree: DetachedRouteHandle): void {}
shouldAttach(route: ActivatedRouteSnapshot): boolean { return false; }
retrieve(route: ActivatedRouteSnapshot): DetachedRouteHandle|null { return null; }
shouldReuseRoute(future: ActivatedRouteSnapshot, curr: ActivatedRouteSnapshot): boolean {
if(hasRouterError) {
hasRouterError = false;
return false;
}
return future.routeConfig === curr.routeConfig;
}
}

DefaultRouteReuseStrategy不同的只有这段代码

if(hasRouterError) {
hasRouterError = false;
return false;
}

不要忘记将它添加到 providers 数组中:

import { RouteReuseStrategy } from '@angular/router';
...
{ provide: RouteReuseStrategy, useClass: PreventErrorRouteReuseStrategy },

你可以在 Modified Plunker 试试

关于javascript - Angular 4 + zonejs : routing stops working after uncaught error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43873642/

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