NGX Translate внутри библиотеки выдает ошибку круговой зависимости при использовании в HTTP_INTERCEPTOR

У меня есть угловая библиотека, в которой я создал 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());
    }
  }

Это позволяет мне объединять файлы локализации библиотеки и приложения.

Внутри своего приложения я импортирую LanguageModule в основной app.module.ts, где я также импортирую свой 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.

Что мне не хватает?


person Aaron Ullal    schedule 06.07.2021    source источник
comment
Возможно ли у вас предоставить стекблиц? Хотелось бы, чтобы у вас был AuthInterceptor. Я также создал библиотеку для моего ngx-translate, но понял, что TranslateModule.forRoot({}) все еще должен быть создан в проекте, который импортирует библиотеку. Также полезно, если вы хотите объединить несколько файлов i18n вместе. один из вашей библиотеки и один из вашего локального проекта   -  person Raphaël Balet    schedule 09.07.2021
comment
обычно вы можете решить круговую зависимость, используя injector или переместив компоненты в другой модуль, см. этот stackoverflow.com/questions/67152273/ (похоже, ваша проблема)   -  person Eliseo    schedule 09.07.2021
comment
@Eliseo Я пробовал использовать инжектор, но все равно получаю ту же ошибку. В этом случае я не могу переместить перехватчик на другой модуль.   -  person Aaron Ullal    schedule 09.07.2021


Ответы (1)


Ваш TranslateService зависит от HttpClient, HttpClient зависит от HTTP_INTERCEPTORS, которые включают AuthInterceptor.

Итак, когда вы добавляете TranslateService в качестве зависимости для AuthInterceptor, вы получаете полный круг: TranslateService = ›TranslateLoader =› HttpClient = ›AuthInterceptor =› TranslateService.

Здесь есть официальное руководство https://angular.io/errors/NG0200

person kemsky    schedule 10.07.2021
comment
Спасибо за понимание! Не могли бы вы подробнее рассказать, как могло бы выглядеть возможное решение? - person Aaron Ullal; 11.07.2021
comment
фактически взглянув на источник службы ngx-translate, он не зависит от HttpClient - person Aaron Ullal; 12.07.2021
comment
@AaronUllal, это зависит от TranslateLoader, который зависит от HttpClient, я обновил ответ. - person kemsky; 12.07.2021
comment
Благодарность! в этом есть смысл. Как бы вы собирались решить этот компакт-диск? Я пробовал использовать инжектор для получения translateService, но все равно получаю ту же ошибку - person Aaron Ullal; 13.07.2021