角:在构造函数中注入路由器给出错误

时间:2018-11-24 17:35:33

标签: angular inject

我正在尝试创建一个全局错误处理组件,为此,我提供了自定义ErrorHandler类。我想通过error.service.ts中的构造函数注入Router,以便可以导航到错误组件,但由于以下错误而失败。

  

compiler.js:18429未捕获的错误:提供程序解析错误:   无法实例化循环依赖! ApplicationRef(“ [ERROR->]”):在./AppModule@-1:-1的NgModule AppModule中

这是项目的链接。 https://stackblitz.com/edit/angular-q56xm8

请检查error.service.ts,如果我取消对第一个实现的注释,则可以使用,但我想使用以下方法使其起作用。

1 个答案:

答案 0 :(得分:2)

让我们尝试通过注册自定义错误处理程序时内部发生的事来了解这一点。

要注册错误处理程序,您可以执行以下操作:

class MyErrorHandler implements ErrorHandler {
  handleError(error) {
    // do something with the exception
  }
}

@NgModule({
  providers: [{provide: ErrorHandler, useClass: MyErrorHandler}]
})
class MyModule {}

现在这是做什么的,它现在使用您的MyErrorHAndler类而不是Angular的ErrorHandler

因此,假设是路由器,它需要MyErrorHandler服务的实例来创建它自己的实例。因此,注入程序将寻找MyErrorHandler的实例来创建Router的实例。

Injector没有MyErrorHandler服务的实例(而不是常规的ErrorHandler),因此它将尝试创建一个实例,以便可以将其提供给Router 。但是,一旦尝试创建MyErrorHandler的实例,就会发现在MyErrorHandler的构造函数中有Router。因此,它将检查可能插入Router的{​​{1}}中的constructor实例。但是它没有找到一个,因为MyErrorHandler是它首先试图实例化的东西。

TL; DR; :为了创建Router的实例,Angular需要一个Router的实例。为了创建MyErrorHandler的实例,它需要MyErrorHandler的实例。这会导致Router依赖于MyErrorHandlerRouter依赖于Router的情况,从而产生了循环依赖。

修正::当您自己完成此操作时,解决方法是使用MyErrorHandler。当您使用它时,为了创建Injector的实例,Angular将不再需要在其中注入MyErrorHandler的实例。因此,在这种情况下不会有任何循环依赖的情况。