将Angular服务注入到导出的函数中?

时间:2019-03-07 08:29:41

标签: angular typescript function dependency-injection angular-services

我在AppComponent中定义了以下导出函数(类外):

export function multiTranslateHttpLoaderFactory(http: HttpClient) {
  return new MultiTranslateHttpLoader(http, [
    {prefix: './assets/i18n/default/', suffix: '.json'},
    {prefix: './assets/i18n/bc/', suffix: '.json'}
  ]);
}

然后以这种方式在AppModule的导入数组中使用它:

TranslateModule.forRoot ({
  loader: {
    provide: TranslateLoader,
    useFactory: multiTranslateHttpLoaderFactory,
    deps: [HttpClient]
  }
}),

我需要一种在导出的函数中使用AuthService的方法,因为我需要某些属性来实现逻辑。

有可能吗?

例如,我想以这种方式使用我的authService:

export function multiTranslateHttpLoaderFactory(http: HttpClient) {
  let bc = this.authService.activeBusinessCase$.getValue();
  if(bc){
    ...
  }else{
    return new MultiTranslateHttpLoader(http, [
      {prefix: './assets/i18n/default/', suffix: '.json'},
      {prefix: './assets/i18n/bc/', suffix: '.json'}
    ]);
  }
}

2 个答案:

答案 0 :(得分:2)

没有什么比这容易的了。

export function multiTranslateHttpLoaderFactory(http: HttpClient, auth: AuthService) {
  // add AuthService logic

  return new MultiTranslateHttpLoader(http, [
    {prefix: './assets/i18n/default/', suffix: '.json'},
    {prefix: './assets/i18n/bc/', suffix: '.json'}
  ]);
}

并将其作为依赖项传递

TranslateModule.forRoot ({
  loader: {
    provide: TranslateLoader,
    useFactory: multiTranslateHttpLoaderFactory,
    deps: [HttpClient, AuthService]
  }
}),

答案 1 :(得分:1)

除此解决方案外,您还可以使用Angular的Injector API。

Follow the docs here