【发布时间】:2021-09-16 21:49:54
【问题描述】:
我有一个 Angular 库,我在其中创建了一个 LanguageModule ,定义如下
@NgModule({
imports: [
TranslateModule.forRoot({
loader: {
provide: TranslateLoader,
useFactory: (createTranslateLoader),
deps: [HttpClient]
},
})
],
exports: [TranslateModule]
})
export class LanguageModule {
public constructor(translateSvc: TranslateService, http: HttpClient) {
translateSvc.onLangChange
.pipe(
switchMap((currentLang: LangChangeEvent) => zip(
of(currentLang),
http.get(`assets/i18n/${currentLang.lang}.json`),
))
).subscribe(([currentLang, localizations, syncfusionLocalization]) => {
translateSvc.setTranslation(translateSvc.currentLang, localizations, true);
setCulture(currentLang.lang);
});
translateSvc.use(translateSvc.getDefaultLang());
}
}
这允许我合并库和应用本地化文件。
在我的应用程序中,我在主app.module.ts 中导入了LanguageModule ,我还导入了我的CoreModule,定义如下:
@NgModule({
imports: [
CommonModule,
HttpClientModule,
BrowserAnimationsModule,
...
],
declarations: [],
providers: [
....
// Http interceptors
{
provide: HTTP_INTERCEPTORS,
useClass: AuthInterceptor,
multi: true
}
]
})
export class CoreModule {
public constructor(@Optional() @SkipSelf() parentModule: CoreModule) {
if (parentModule) {
throw new Error('CoreModule has already been loaded. Import CoreModule in the AppModule only.');
}
}
}
在AuthInterceptor 中,如果我注入TranslateService ,我会收到以下错误:
Circular dependency in DI detected for InjectionToken HTTP_INTERCEPTORS.
我错过了什么?
【问题讨论】:
-
你们可以提供一个stackblitz吗?我想知道你的 AuthInterceptor 有什么。我确实也为我的 ngx-translate 创建了一个库,但意识到
TranslateModule.forRoot({})仍然必须在导入该库的项目中实例化。如果您想将多个 i18n 文件合并在一起,这也很有用。 您的图书馆中的一个和您本地项目中的一个 -
通常您可以使用
injector或将组件移动到不同的模块来解决循环依赖关系,请参阅此stackoverflow.com/questions/67152273/…(看起来像您的问题) -
@Eliseo 我已经尝试过使用注射器,但仍然遇到同样的错误。在这种情况下,我无法将拦截器移动到另一个模块
标签: angular ngx-translate