Подтвердить что ты не робот

Передайте данные конфигурации с помощью forRoot

Я пытаюсь передать данные конфигурации в пользовательскую библиотеку в Angular.

В пользовательском приложении они передадут некоторые данные конфигурации в мою библиотеку, используя 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 {}

В моей пользовательской библиотеке, в частности index.ts, я могу получить доступ к данным конфигурации:

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

Мой вопрос заключается в том, как сделать данные конфигурации доступными в пользовательской библиотеке SampleService

В настоящее время SampleService содержит следующее:

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

Я прочитал документы Providers, однако пример forRoot довольно минимален и, похоже, не охватывает мои использование случай.

4b9b3361

Ответ 1

Вы почти у цели, просто предоставьте SampleService и config в своем модуле, как показано ниже:

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

Ответ 2

У меня есть вопрос, как можно было бы сделать то же самое, что в этом вопросе, но со статическими методами на классе Service, я имею в виду, если все методы, которые у меня есть в ServiceClass, являются статическими, я не могу объявить как частные свойства конфиг в конструкторе как в ответе. constructor(@Inject('config') private config:CustomConfig)

Я не могу использовать этот config потому что он не статический, и я не могу объявить параметр как статический. Как мне решить это? Заранее спасибо.

Ответ 3

Другие ответы оба хороши. Я добавляю это для своей простоты.

import { NgModule, ModuleWithProviders } from '@angular/core';
import { SampleService } from './src/sample.service';
...
@NgModule({
  // ...
})
export class SampleModule {
  static forRoot(config: CustomConfig): ModuleWithProviders {
    console.log(config);
    return {
      ngModule: SampleModule,
      providers: [{
        provide: SampleService,
        useValue: new SampleService(config)
      }]
    };
  }
}

Почему это проще? Потому что вам нужен базовый строительный блок всех программ JavaScript... закрытие!