Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 角度:在构造函数中注入路由器,给出错误_Angular_Inject - Fatal编程技术网

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

Angular 角度:在构造函数中注入路由器,给出错误,angular,inject,Angular,Inject,我试图创建一个全局错误处理组件,为此,我提供了自定义的ErrorHandler类。我想通过error.service.ts中的构造函数注入路由器,这样我就可以导航到错误组件,但它失败了,错误如下 compiler.js:18429未捕获错误:提供程序分析错误: 无法实例化循环依赖项!ApplicationRef(“[ERROR->]”):在NgModule-AppModule中。/AppModule@-1:-1 这是项目的链接 请检查error.service.ts,如果我取消注释第一个实现,它

我试图创建一个全局错误处理组件,为此,我提供了自定义的ErrorHandler类。我想通过error.service.ts中的构造函数注入路由器,这样我就可以导航到错误组件,但它失败了,错误如下

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

这是项目的链接


请检查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
的实例。