web-dev-qa-db-fra.com

Passer les données de configuration en utilisant forRoot

J'essaie de transmettre des données de configuration dans une bibliothèque personnalisée dans Angular.

Dans l'application utilisateur , ils transmettront certaines données de configuration à ma bibliothèque à l'aide de 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 {}

Dans ma bibliothèque personnalisée , plus précisément le index.ts, Je peux accéder aux données de configuration:

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]
    };
  }
}

Ma question est de savoir comment rendre les données de configuration disponibles dans SampleService de la bibliothèque personnalisée

Actuellement, SampleService contient les éléments suivants:

@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);
  } 
}

J'ai lu la documentation sur Providers , mais l'exemple forRoot est plutôt minimal et ne semble pas couvrir mon cas d'utilisation.

42
Michael Doye

Vous y êtes presque, indiquez simplement SampleService et config dans votre module, comme ci-dessous:

export class SampleModule {
  static forRoot(config: CustomConfig): ModuleWithProviders {
    // 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 );
  }
}
67