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);
Другие вопросы по тегам