我正在尝试创建一个全局错误处理组件,为此,我提供了自定义ErrorHandler类。我想通过error.service.ts中的构造函数注入Router,以便可以导航到错误组件,但由于以下错误而失败。
compiler.js:18429未捕获的错误:提供程序解析错误: 无法实例化循环依赖! ApplicationRef(“ [ERROR->]”):在./AppModule@-1:-1的NgModule AppModule中
这是项目的链接。 https://stackblitz.com/edit/angular-q56xm8
请检查error.service.ts,如果我取消对第一个实现的注释,则可以使用,但我想使用以下方法使其起作用。
答案 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
依赖于MyErrorHandler
且Router
依赖于Router
的情况,从而产生了循环依赖。
修正::当您自己完成此操作时,解决方法是使用MyErrorHandler
。当您使用它时,为了创建Injector
的实例,Angular将不再需要在其中注入MyErrorHandler
的实例。因此,在这种情况下不会有任何循环依赖的情况。