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

问题描述 投票:6回答:1

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

所以这是我的结构:

enter image description here

  • App模块当然是自举的主要模块
  • 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(不是首选)?定制装载机? t.b.h.我不知道,文档对于更高级的场景来说有点短。

angular lazy-loading angular7 ngx-translate
1个回答
4
投票

我通过以下方式解决了这个问题:

  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而不是别的。
© www.soinside.com 2019 - 2024. All rights reserved.