javascript – Angular 4 zonejs:路由在未捕获的错误后停止工作

前端之家收集整理的这篇文章主要介绍了javascript – Angular 4 zonejs:路由在未捕获的错误后停止工作前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如果在路由期间组件(构造函数或ngOnInit)中存在未被捕获的错误,则导航将不再起作用.

即使有一个全局的ErrorHandler和一个用于RouterModule的ErrorHandler,也会发生这种情况,同时添加了一个ZoneListener – 请参阅app.module.ts

这里最小的例子:
https://embed.plnkr.co/L19S3hKWyqgKUIT1EJlI/preview

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

如何处理意外的,未被捕获的错误,以确保它们不会破坏整个应用程序?

解决方法

我会做一些解决方法,如:
  1. let hasRouterError = false;
  2. @Injectable()
  3. export class MyErrorHandler implements ErrorHandler {
  4. constructor(private inj: Injector) {}
  5.  
  6. handleError(error: any): void {
  7. console.log('MyErrorHandler: ' + error);
  8.  
  9. if(hasRouterError) {
  10. let router = this.inj.get(Router);
  11. router.navigated = false;
  12. }
  13.  
  14. //throw error; // it is necessarily otherwise handleError won't be executed during next error
  15. }
  16. }
  17.  
  18. export function MyRouterErrorHandler(error: any) {
  19. console.log('RouterErrorHandler: ' + error);
  20. hasRouterError = true;
  21. throw error;
  22. }

我们必须使用自定义RouteReuseStrategy:

  1. export class PreventErrorRouteReuseStrategy implements RouteReuseStrategy {
  2. shouldDetach(route: ActivatedRouteSnapshot): boolean { return false; }
  3. store(route: ActivatedRouteSnapshot,detachedTree: DetachedRouteHandle): void {}
  4. shouldAttach(route: ActivatedRouteSnapshot): boolean { return false; }
  5. retrieve(route: ActivatedRouteSnapshot): DetachedRouteHandle|null { return null; }
  6. shouldReuseRoute(future: ActivatedRouteSnapshot,curr: ActivatedRouteSnapshot): boolean {
  7. if(hasRouterError) {
  8. hasRouterError = false;
  9. return false;
  10. }
  11. return future.routeConfig === curr.routeConfig;
  12. }
  13. }

它与DefaultRouteReuseStrategy的区别仅在于此代码

  1. if(hasRouterError) {
  2. hasRouterError = false;
  3. return false;
  4. }

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

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

你可以在Modified Plunker尝试一下

猜你在找的JavaScript相关文章