ng2-перевод в CoreModule

В нашем приложении Angular есть функциональные модули, а также основной и общий модули, как описано в рекомендациях структуры Angular - linkStyle.

Мы используем ng2-translate и согласно документу, мы должны позвонить forRoot() в модуле приложения (корневой модуль).

Вот так выглядит наш модуль приложения:

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    BrowserAnimationsModule,
    FeatureAModule,
    FeatureBModule,
    CoreModule,
    TranslateModule.forRoot({
        provide: TranslateLoader,
        useFactory: (createTranslateLoader),
        deps: [Http]
    })
  ],
  bootstrap: [AppComponent]
})
export class AppModule { }

Поскольку мы хотим перевести наше меню и его часть в основной модуль, нам пришлось импортировать туда модуль перевода, например, так:

@NgModule({
  imports: [
    TranslateModule
  ],
  exports: [
      FormsModule,
      MenuComponent,
      BreadcrumbComponent
  ],
  declarations: [MenuComponent, BreadcrumbComponent]
})
export class CoreModule {
    constructor( @Optional() @SkipSelf() parentModule: CoreModule) {
      throwIfAlreadyLoaded(parentModule, "CoreModule");
    }
 }

Имеет ли это смысл? Должен ли я удалить TranslateModule.forRoot(...) из модуля приложения и поместить его в импорт основного модуля? Это неправильно?

1 ответ

Решение

Если вы читаете документы, то AppModule будет единственным для импорта CoreModule, Если это так, все будет работать нормально, если вы просто добавите TranslateModule.forRoot() в CoreModule.imports массив и TranslateModule в CoreModule.exports массив. Тогда в вашем AppModuleвсе, что вам нужно сделать, это импортировать CoreModule без необходимости иметь дело с модулем перевода снова.

Это похоже на то, как документы предлагают интегрировать RouterModule например. Посмотрите на это. Заметить, что RouterModule.forRoot() импортируется в AppRoutingModule, но не в AppModule сам. Так что на вашем месте я бы имел:

CoreModule

// forRoot is OK here because AppModule is the only one to import CoreModule
imports: [TranslateModule.forRoot(...)]

// will make Translate available to AppModule
exports: [TranslateModule]

AppModule

//importing Core will import Translate and its services provided by .forRoot()
imports: [CoreModule]

SharedModule

//only if the components, directives and pipes of SharedModule need Translate
imports: [TranslateModule]

//so that all modules that import SharedModule will have Translate access
exports: [TranslateModule]
Другие вопросы по тегам