Apache连接renderd.sock权限拒绝及Angular4循环依赖问题求助
问题2:Angular4自定义ErrorHandler注入Router导致循环依赖
这个循环依赖是因为Router本身依赖ApplicationRef,而ErrorHandler在应用初始化阶段就会被创建,直接注入Router会形成闭环。解决办法是用Injector延迟获取Router实例,避开初始化阶段的依赖冲突。
修改你的CustomErrorHandler代码如下:
import { ErrorHandler, Injectable, Injector } from '@angular/core'; import { Router } from '@angular/router'; import { WSClientService } from '../services/wslib/wsclient.service'; import { environment } from '../../environments/environment'; // 引入环境配置 @Injectable() export class CustomErrorHandler implements ErrorHandler { // 声明Router变量,但不在构造函数中直接注入 private router: Router; constructor( private injector: Injector, // 注入依赖注入容器 private wsClient: WSClientService ) {} handleError(error: any): void { // 延迟获取Router,避免初始化时触发循环依赖 if (!this.router) { this.router = this.injector.get(Router); } // 生产环境下自动跳转到登录页 if (environment.production) { this.router.navigate(['/login']); } // 保留你的错误处理逻辑,比如上报到服务端 console.error('全局捕获错误:', error); this.wsClient.sendErrorLog(error); } }
最后确保在AppModule中正确注册这个自定义错误处理器:
import { NgModule, ErrorHandler } from '@angular/core'; import { CustomErrorHandler } from './core/custom-error-handler'; // 替换成你的实际路径 @NgModule({ providers: [ { provide: ErrorHandler, useClass: CustomErrorHandler } ] }) export class AppModule {}
原理很简单:Injector是Angular的依赖注入容器,通过它在handleError方法执行时才去获取Router实例,完美避开了初始化阶段的循环依赖问题。
内容的提问来源于stack exchange,提问作者Tommie Jones
相关产品推荐
相关产品推荐

