Angular2 обеспечивает настройку библиотеки
Я пишу библиотечный сервис для Angular 2 и хочу, чтобы вызывающее приложение могло предоставить некоторую конфигурацию. Я мог бы создать абстрактные свойства для базовых классов, но это привело бы к тому, что вызывающему приложению пришлось бы определять конфигурацию в нескольких местах.
В приложениях Angular2 я использую такую технику в основном модуле приложения
let config: any = { param1: 'value 1', param2: 'value 2' };
@NgModule({
providers: [ {provide: 'app.config', useValue: config } ]
})
Затем я могу ввести конфигурацию, где это необходимо, с помощью @Inject('app.config') . Однако, так как библиотека, которую я пишу, определяет базовые классы для расширения, я не хочу, чтобы это значение вводилось в конструктор, так как это потребовало бы, чтобы вызывающее приложение внедрило значение и переслало его через super().
Я смотрел на класс ReflectiveInjector, но он хочет тип, а не строку.
let appConfig = ReflectiveInjector.resolve('app.config').get();
Как мне этого добиться?
2 ответа
Вы можете определить OpaqueToken
export const APP_CONFIG = new OpaqueToken('app.config');
И использовать его как тип, а не использовать строку
let appConfig = ReflectiveInjector.resolve(APP_CONFIG).get();
Если я правильно понял, вы хотите загрузить некоторые данные конфигурации за один запрос до инициализации приложения и сохранить их в единственном экземпляре. Я настоятельно рекомендую вам взглянуть на пост # 37611549, так как он объясняет использование APP_INITIALIZER - для выполнения функции, когда приложение инициализируется, и откладывать то, что оно предоставляет, если функция возвращает обещание.
Я смотрел на класс ReflectiveInjector, но он хочет тип, а не строку.
Что-то вроде этого?
let config: any = { param1: 'value 1', param2: 'value 2' };
let injector: any = ReflectiveInjector.resolveAndCreate([
{
provide: 'app.config',
useValue: config
}
]);
let configService = injector.get('app.config');
console.log(configService);