Angular 角度:在构造函数中注入路由器,给出错误
我试图创建一个全局错误处理组件,为此,我提供了自定义的ErrorHandler类。我想通过error.service.ts中的构造函数注入路由器,这样我就可以导航到错误组件,但它失败了,错误如下 compiler.js:18429未捕获错误:提供程序分析错误: 无法实例化循环依赖项!ApplicationRef(“[ERROR->]”):在NgModule-AppModule中。/AppModule@-1:-1 这是项目的链接Angular 角度:在构造函数中注入路由器,给出错误,angular,inject,Angular,Inject,我试图创建一个全局错误处理组件,为此,我提供了自定义的ErrorHandler类。我想通过error.service.ts中的构造函数注入路由器,这样我就可以导航到错误组件,但它失败了,错误如下 compiler.js:18429未捕获错误:提供程序分析错误: 无法实例化循环依赖项!ApplicationRef(“[ERROR->]”):在NgModule-AppModule中。/AppModule@-1:-1 这是项目的链接 请检查error.service.ts,如果我取消注释第一个实现,它
请检查error.service.ts,如果我取消注释第一个实现,它会工作,但我想使用下面的方法使它工作 让我们通过一个例子来理解这一点:当您注册自定义错误处理程序时,内部发生了什么 要注册错误处理程序,请执行以下操作:
class MyErrorHandler implements ErrorHandler {
handleError(error) {
// do something with the exception
}
}
@NgModule({
providers: [{provide: ErrorHandler, useClass: MyErrorHandler}]
})
class MyModule {}
现在,它使用的是MyErrorHAndler
类,而不是Angular类
所以,假设路由器需要一个MyErrorHandler
服务的实例来创建自己的实例。因此,注入器将查找MyErrorHandler
的实例,以创建路由器的实例
注入器没有MyErrorHandler
服务的实例(而不是常规的ErrorHandler
),因此它将尝试创建一个实例,以便将其提供给路由器。但是,当它试图创建MyErrorHandler
的实例时,它发现在MyErrorHandler
的构造函数中有一个路由器。因此,它将检查路由器
的实例,该实例可能会注入MyErrorHandler
的构造函数
。但是它没有找到一个路由器,因为它一开始就试图实例化路由器
TL;博士;:Angular为了创建路由器的实例
需要MyErrorHandler的实例
。为了创建MyErrorHandler
的实例,它需要Router
的实例。这会造成这样一种情况,即MyErrorHandler
依赖于Router
,Router
依赖于MyErrorHandler
,从而创建循环依赖关系
修复:由于您是自己完成的,修复方法是使用注入器
。当您使用它时,为了创建MyErrorHandler
Angular的实例,将不再需要在其中插入Router
的实例。因此,在这种情况下不存在任何循环依赖关系。由于错误消息中写入的问题,您不能使用第二种方法:存在循环依赖关系:路由器直接或间接地需要错误句柄,错误处理程序需要路由器。使用第一种方法:这是处理问题的正确方法。如果我插入组件构造函数但不在服务中工作,请您详细说明一下它是如何工作的。好的,您可以将路由器插入组件中,因为路由器的依赖项中没有您的组件。所以这不会产生循环依赖。但是路由器需要错误处理程序。因此,如果错误处理程序还需要路由器,这将创建一个循环依赖项。如果实例化是一个像@NgModule({providers:[myerrhandler]})这样的普通提供程序,那么实例化将如何发生呢?好的,它将正常发生。Angular的注入器将被要求创建MyErrorHandler的实例,它将检查是否已经有一个实例。如果没有,它会检查MyErrorHandler
需要实例化的所有内容,它会将它们提供给MyErrorHandler
的构造函数,并最终创建MyErrorHandler
的实例。