Tengo un módulo que usa AgmCoreModule . Toma la apiKey aplicada en forRoot y la agrega AgmCoreModule a través LAZY_MAPS_API_CONFIG :
...some_module.ts export const AgmCoreModuleForRoot = AgmCoreModule.forRoot() imports: [ AgmCoreModuleForRoot, ] providers: [ { provide: LAZY_MAPS_API_CONFIG, useClass: GoogleMapsConfigService, deps: [GoogleMapsConfigServiceConfig], }, ], export class SomeModule { static forRoot( config?: GoogleMapsConfigServiceConfig, ): ModuleWithProviders<SomeModule> { return { ngModule: SomeModule, providers: [{ provide: GoogleMapsConfigServiceConfig, useValue: config }], }; } } El módulo está hecho principalmente de componentes que no necesitan AgmCoreModule , por lo que SomeModule se puede importar con un forRoot en blanco como SomeModule.forRoot() .
Sin embargo, tengo problemas para usar SomeModule con aplicaciones que tienen AgmCoreModule importado en un módulo superior, digamos App.module . Y eso anula el AgmCoreModule de forRoot .
ejemplo:
...app.module imports:[ AgmCoreModule.forRoot({ apiKey: environment.googleApiKey, libraries: ['places'], }), ...downstream.module.ts imports: [ SomeModule.forRoot() <-- This overwrites the above apiKey making the google places api not work Me gustaría tener la flexibilidad de cargar condicionalmente AgmCoreModule en función de la existencia de una apiKey en forRoot de SomeModule .
¿Es esto siquiera una cosa?
No puedo ver su AgmCoreModule , pero ¿ha intentado hacer algo como lo siguiente para evitar volver a importar los módulos principales?
// module-import.guard.ts export function throwIfAlreadyLoaded(parentModule: any, moduleName: string) { if (parentModule) { throw new Error(`${moduleName} has already been loaded, import Core modules in the AppModule only.`); } } // agm-core.module.ts export class AgmCoreModule{ constructor(@Optional() @SkipSelf() parentModule: AgmCoreModule) { throwIfAlreadyLoaded(parentModule, 'AgmCoreModule'); } } En cuanto a la situación de sobreescritura de la clave api , ¿no puede simplemente envolverla para devolver otra cosa si la configuración no está allí? ¿O SomeModule necesita comunicarse con GoogleMapsConfigService? Si no es así, tal vez algo como lo siguiente pueda ayudarlo:
export class SomeModule { static forRoot(config?: GoogleMapsConfigServiceConfig): ModuleWithProviders<SomeModule> { if(config) { return { ngModule: SomeModule, providers: [{ provide: GoogleMapsConfigServiceConfig, useValue: config }], }; } return { ngModule: SomeModule }; } }