Angular中LogoutService注入AuthModule报错原因咨询
问题:Angular中设置LogoutService的providedIn为AuthModule时出现初始化错误的原因
我希望创建一个仅能在其所属的AuthModule及导入该模块的模块中注入的LogoutService。当为LogoutService设置providedIn: AuthModule时,出现错误:Uncaught ReferenceError: Cannot access 'AuthModule' before initialization;若设置providedIn: 'root'则无报错,但服务会在整个应用中可用。请问该报错的原因是什么?
AuthModule代码
@NgModule({ declarations:[LoginComponent, LogoutComponent, HomeComponent], exports:[LoginComponent,LogoutComponent, HomeComponent] }) export class AuthModule { }
LogoutService代码
import { AuthModule } from './auth.module' @Injectable({ providedIn: AuthModule }) export class LogoutService{ constructor(){ } isLogout(){ console.log("Is logout successful"); } }
AppModule代码
@NgModule({ declarations: [ AppComponent, DemoDynamicComponent, TestComponent ], imports: [ BrowserModule, AppRoutingModule, AuthModule // 此处触发错误:Uncaught ReferenceError: Cannot access 'AuthModule' before initialization ], providers: [], bootstrap: [AppComponent] }) export class AppModule { }
错误原因
这是循环依赖导致的问题:
- AuthModule中的组件(比如LogoutComponent)必然会依赖并注入LogoutService;
- 而LogoutService又通过
providedIn: AuthModule直接引用了AuthModule类; - 当Angular启动初始化AppModule时,会先加载AuthModule,但此时AuthModule依赖的LogoutService需要引用还未完成初始化的AuthModule,从而触发了“无法在初始化前访问AuthModule”的错误。
解决方案
方案1:在AuthModule的providers数组中声明服务(推荐)
这是Angular实现模块级限定服务的常规方式,既能限定服务的作用域,又能避免循环引用:
修改AuthModule,将LogoutService加入providers数组:
import { LogoutService } from './logout.service'; @NgModule({ declarations: [LoginComponent, LogoutComponent, HomeComponent], exports: [LoginComponent, LogoutComponent, HomeComponent], providers: [LogoutService] // 在此处声明服务 }) export class AuthModule { }
同时修改LogoutService,移除providedIn: AuthModule(或设为undefined):
@Injectable({ providedIn: undefined // 或直接删除该属性 }) export class LogoutService{ constructor(){ } isLogout(){ console.log("Is logout successful"); } }
方案2:使用字符串形式引用模块(可选)
如果坚持使用providedIn语法,可以通过字符串路径引用模块,避免直接引用类来规避循环依赖:
@Injectable({ providedIn: 'auth.module#AuthModule' // 用字符串指定模块 }) export class LogoutService{ constructor(){ } isLogout(){ console.log("Is logout successful"); } }
内容的提问来源于stack exchange,提问作者sql_dummy
相关产品推荐
相关产品推荐

