Ngx使用共享/延迟加载模块进行翻译

时间:2018-11-21 13:53:05

标签: angular lazy-loading angular7 ngx-translate

可能是最常见的问题之一,而我发现的documentation和某些other questions试图为我解决问题,但我仍然不确定如何解决此问题。

这是我的结构:

enter image description here

  • 应用模块当然是引导的主要模块
  • Countryselector模块:负责加载默认国家(基于IP),并根据浏览器确定使用哪种语言。基本上,它是决定使用哪个国家/地区语言的核心功能,并且包含一个供用户更改国家/地区语言的下拉菜单。
  • 结帐模块,选择模块,付款模块都随路径进行了延迟加载。

AppModule

export function HttpLoaderFactory(http: HttpClient) {
  return new TranslateHttpLoader(http);
}

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    HttpClientModule,
    BrowserModule,
    AppRoutingModule,
    ContrySelectorModule,
    TranslateModule.forRoot({
      loader: {
        provide: TranslateLoader,
        useFactory: HttpLoaderFactory,
        deps: [HttpClient]
      }
    })
  ],
  export class AppModule { }

CountrySelectorModule

@NgModule({
  declarations: [CountryselectorComponent],
  imports: [
    CommonModule,
    TranslateModule.forRoot({
      loader: {
        provide: TranslateLoader,
        useFactory: HttpLoaderFactory,
        deps: [HttpClient]
      }
    })
  ],
  exports: [
    CountryselectorComponent
  ]
})
export class ContrySelectorModule { }

选择模块:

@NgModule({
  declarations: [SelectionComponent],
  imports: [
    CommonModule,
    SelectionRoutingModule,
    UspblockModule,
    TranslateModule.forChild({//or forRoot, no idea how to configure this
      loader: {
        provide: TranslateLoader,
        useFactory: HttpLoaderFactory,
        deps: [HttpClient]
      }})
  ],
})
export class SelectionModule { }

现在的问题是,我不想在延迟加载的模块中再次进行语言配置,因为国家/地区选择器模块已经解决了这一问题。我现在不确定如何正确配置延迟加载的模块(并且实际上不确定countrySelectorModule是否正确完成)。使用standard github documentation,我无法做到这一点。我已经尝试过.forChild(),但到目前为止还没有运气。

我需要共享模块吗?我是否需要在任何地方导入countrySelectorModule(不推荐)?定制装载机?时我不知道,对于更高级的方案来说,文档太短了。

1 个答案:

答案 0 :(得分:2)

我通过以下操作解决了这个问题:

  1. 使用以下代码创建一个CoreModule(基本上是一个共享模块)

CoreModule

export function HttpLoaderFactory(http: HttpClient) {
  return new TranslateHttpLoader(http);
}

@NgModule({
  declarations: [],
  imports: [
    CommonModule,
    TranslateModule.forChild({
      loader: {
      provide: TranslateLoader,
      useFactory: HttpLoaderFactory,
      deps: [HttpClient]
    },
    isolate: false
}),
  ],
  exports: [TranslateModule],
})
export class CoreModule {

  static forRoot(): ModuleWithProviders {
    return {
      ngModule: CoreModule,
      providers: [ShoppingCartService, AccountService]
    }
  }
}

因此,这确保了对于每个导入CoreModule的模块,TranslateModule将使用相同的配置。确保将其导出。 forRoot()还解决了确保ShoppingCartServiceAccountService只是一个实例,而不是每个惰性模块都创建单独服务的问题。

  1. 更改AppModule:

AppModule

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    HttpClientModule,
    BrowserModule,
    AppRoutingModule,
    TranslateModule.forRoot({
      loader: {
        provide: TranslateLoader,
        useFactory: HttpLoaderFactory,
        deps: [HttpClient]
      },
      isolate : false
    }),
    CoreModule.forRoot(),
    ContrySelectorModule,

  ],
  providers: [    ],
  bootstrap: [AppComponent]
})
export class AppModule { }

由于AppModule是您的主要入口点,因此请在此处forRoot()调用TranslateModule

  1. 任何延迟加载的模块都只需导入CoreModule而无需任何方法调用。同样,在我的示例中,CountrySelectorModule只需要导入CoreModule即可。