angular - 使用共享/延迟加载模块的 Ngx 翻译

标签 angular lazy-loading angular7 ngx-translate

可能是最常见的问题之一,而 documentation还有一些other questions我发现尝试为我解决问题,但我仍然不确定如何解决这个问题。

所以这是我的结构:

enter image description here

  • App 模块当然是引导的主要模块
  • Countryselector 模块:负责加载默认国家/地区(基于 IP)并负责根据浏览器决定使用哪种语言。它基本上是决定使用哪种国家/语言的核心功能+它包含一个下拉列表供用户更改国家/语言。
  • 结账模块、选择模块、支付模块均采用路由延迟加载。

应用模块

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 { }

国家选择器模块

@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.我不知道,对于更高级的场景,文档有点短。

最佳答案

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

  1. 创建一个SharedModule,代码如下

共享模块

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 SharedModule {

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

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

  1. 更改 AppModule:

应用模块

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

因为 AppModule 是您的主要入口点,所以在此处执行 forRoot() 调用 TranslateModuleSharedModule.

  1. 任何惰性加载模块只需要导入 SharedModule 而无需任何方法调用。此外,在我的示例中,CountrySelectorModule 只需导入 SharedModule,无需导入其他任何内容。

关于angular - 使用共享/延迟加载模块的 Ngx 翻译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53413612/

相关文章:

angular - 类型 'Observable<Object>' 不可分配给类型 'Observable<boolean>'

javascript - 如何从组件循环向主要父级发出事件 angular 5

jsf-2 - Primefaces DataTable、延迟加载和每行命令按钮

Angular 7 未按要求发送正确的 header

entity-framework - 记录延迟加载操作

java - 了解如何在 hibernate 中的急切(非惰性)加载中获取对象

angular - 如何在 Angular 的 Reactive Forms 中设置值以形成控件

spring - Spring Boot 的 CORS 问题

javascript - 函数未在 HTMLButtonElement.onclick Angular 4 中定义

javascript - 如何让 Angular Universal 和 PWA 协同工作?