Угловое 7-компонентное наследование с использованием глобального инжектора - PullRequest
0 голосов
/ 07 ноября 2018

Я использовал подход, описанный в блоге MSDN , чтобы упростить расширение компонентов без необходимости предоставления всех зависимостей в вызове super(). Однако это перестало работать в Angular 7 с Typescript 3.

Итак, после начальной загрузки я пытаюсь сохранить инжектор в службе, а затем пытаюсь получить его.

platformBrowserDynamic().bootstrapModule(AppModule).then(ref => {
  // Store module's injector in the AppInjector class
  console.log('Expected #1: storing app injector');
  AppInjector.setInjector(ref.injector);
})

и затем в базовый компонент извлекаю сохраненный инжектор

export class BaseComponent {
  constructor() {
    console.log('Expected #2: retrieving stored injector');
    const injector = AppInjector.getInjector();
  }
}

Однако, глядя на консоль, порядок меняется на противоположный - сначала вызывается конструктор BaseComponent, после чего обещание boostrapModule() разрешается.

Я не уверен, что в Angular 7 процесс начальной загрузки ведет себя иначе, как подсказка в журналах консоли. То же самое решение использовалось в Angular 6 с Typescript 2, но с версией 7 оно перестало работать. Вот фрагмент стека сломанного приложения, основанного на статье MSDN: https://stackblitz.com/edit/component-inheritance-angular-7

Итак, основной вопрос - как гарантировать, что AppInjector.setInjector() произойдет до AppInjector.getInjector()?

1 Ответ

0 голосов
/ 07 ноября 2018

Я установил сервис инжектора в AppModule, и это означает, что я буду внедрять Инжектор и устанавливать его в конструкторе AppModule и сохраню сервис инжектора в глобальном объекте

export class AppModule { 
  constructor(injector:Injector){
  // Store module's injector in the AppInjector class
  console.log('Expected #1: storing app injector');
  AppInjector.setInjector(injector);
  }
}

демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...