【问题标题】:Angular 4 + zonejs: routing stops working after uncaught errorAngular 4 + zonejs:未捕获错误后路由停止工作
【发布时间】:2017-10-07 23:46:22
【问题描述】:

如果在路由期间来自组件(构造函数或 ngOnInit)的未捕获错误,则导航将不再起作用。

即使 RouterModule 有一个全局 ErrorHandler 和一个 ErrorHandler 也会发生这种情况,添加了一个 ZoneListener 以确保为好 - 请参阅 app.module.ts

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

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

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

【问题讨论】:

  • 查看issue。可能会在下一个版本中修复
  • @PierreDuc 我认为这无济于事。您可以在 plunker 中设置 4.1.1 版本
  • @PierreDuc: yurzui 是对的,即使是 4.1.1 问题仍然存在

标签: javascript angular error-handling navigation zonejs


【解决方案1】:

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

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

中试用

【讨论】:

  • yurzui,我已经投了赞成票,但我偶然发现了shouldReuseRoute 的输入。我知道文档将它们写为 future, curr 但如果您在该行上放置一个调试器并从 home 导航到 about 例如,future.routeConfig 将变为 home。不是倒过来了吗?
  • @echonax 这很奇怪,但您可以使用默认策略take.ms/DpW8O 观察到相同的行为future.routeConfig === curr.routeConfigcurr.routeConfig === future.routeConfig github.com/angular/angular/blob/4.1.1/packages/router/src/… 没关系
  • @yurzui:非常感谢 - 经过一番努力,我们得到了它的解决方法!我们的 routerLinks 没有以斜线开头,这产生了一个新问题 :) - 如果你喜欢看一下:stackoverflow.com/questions/43889889
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-11
  • 1970-01-01
  • 1970-01-01
  • 2013-01-01
  • 2017-11-12
  • 2023-01-04
  • 1970-01-01
相关资源
最近更新 更多