Probablement l'une des questions les plus courantes, alors que documentation et certaines autres questions j'ai trouvé essayer de clarifier les choses pour moi, mais je ne sais toujours pas comment résoudre ce problème.
Voici donc ma structure:
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 { }
Module de sélection:
@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 { }
Maintenant, le problème est que je ne veux pas refaire la configuration de la langue dans les modules paresseux, car le module de sélection de pays s'en occupe déjà. Je ne sais pas maintenant comment configurer correctement les modules chargés paresseux (et en fait je ne sais pas si countrySelectorModule est fait correctement). En utilisant la documentation standard de github je n'ai pas pu retirer ceci. J'ai essayé de jouer avec .forChild()
mais pas de chance jusqu'à présent.
Ai-je besoin d'un module de partage? Dois-je importer countrySelectorModule partout (non préféré)? Chargeur personnalisé? t.b.h. Je n'en ai aucune idée et la documentation est un peu courte pour des scénarios plus avancés.
J'ai résolu ce problème en procédant comme suit:
CoreModule
(essentiellement un module partagé), avec le code ci-dessousCoreModule
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]
}
}
}
Cela garantit donc que pour chaque module qui importe CoreModule
, TranslateModule
utilisera la même configuration. Assurez-vous de l'exporter. La forRoot()
a également résolu en s'assurant que ShoppingCartService
et AccountService
ne sont qu'une seule instance et pas tous les lazy-module créant un service séparé.
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 { }
Puisque AppModule
est votre principal point d'entrée, faites ici la fonction forRoot()
pour TranslateModule
CoreModule
sans aucun appel de méthode. De plus, CountrySelectorModule
dans mon exemple doit simplement importer CoreModule
et rien d'autre.