Estoy tratando de pasar datos de configuración a una biblioteca personalizada en Angular.
En la aplicación de los usuarios , pasarán algunos datos de configuración a mi biblioteca usando forRoot
// Import custom library import { SampleModule, SampleService } from 'custom-library'; ... // User provides their config const CustomConfig = { url: 'some_value', key: 'some_value', secret: 'some_value', API: 'some_value' version: 'some_value' }; @NgModule({ declarations: [...], imports: [ // User config passed in here SampleModule.forRoot(CustomConfig), ... ], providers: [ SampleService ] }) export class AppModule {} En mi biblioteca personalizada , específicamente index.ts , puedo acceder a los datos de configuración:
import { NgModule, ModuleWithProviders } from '@angular/core'; import { SampleService } from './src/sample.service'; ... @NgModule({ imports: [ CommonModule ], declarations: [...], exports: [...] }) export class SampleModule { static forRoot(config: CustomConfig): ModuleWithProviders { // User config get logged here console.log(config); return { ngModule: SampleModule, providers: [SampleService] }; } } Mi pregunta es ¿cómo hago que los datos de configuración estén disponibles en el SampleService de la biblioteca personalizada?
Actualmente SampleService contiene lo siguiente:
@Injectable() export class SampleService { foo: any; constructor() { this.foo = ThirdParyAPI(/* I need the config object here */); } Fetch(itemType:string): Promise<any> { return this.foo.get(itemType); } } He leído los documentos en Proveedores , sin embargo, el ejemplo de forRoot es bastante mínimo y no parece cubrir mi caso de uso.
Ya casi llega, simplemente proporcione SampleService y config en su módulo como se muestra a continuación:
export class SampleModule { static forRoot(config: CustomConfig): ModuleWithProviders<SampleModule> { // User config get logged here console.log(config); return { ngModule: SampleModule, providers: [SampleService, {provide: 'config', useValue: config}] }; } } @Injectable() export class SampleService { foo: string; constructor(@Inject('config') private config:CustomConfig) { this.foo = ThirdParyAPI( config ); } }Actualizar :
Dado que Angular 7 ModuleWithProviders es genérico, necesita ModuleWithProviders<SampleService>