Передайте данные конфигурации с помощью 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
довольно минимален и, похоже, не охватывает мои использование случай.
Ответы
Ответ 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... закрытие!