ручное TypeScript Угловое внедрение зависимости не удалось на ChangeDetectorRef - PullRequest
0 голосов
/ 28 февраля 2019

В моем приложении Angular я реализовал метод ручного внедрения зависимостей для дочерних классов TypeScript, описанный в этом блоге .Цель состояла в том, чтобы устранить необходимость вводить поставщиков в дочерние классы, просто чтобы передать их в родительский класс.В то время все работало нормально.

Некоторое время спустя, когда я перешел на использование его во втором модуле Angular, это не удалось.Поиск обнаружил, что предыдущий метод мог (должен?) Сломаться в Angular 7 (см. этот вопрос ), но первый вариант использования продолжал функционировать.

Я сузил его до определенногонеудачная инъекция: ChangeDetectorRef (CDR).Если я обертываю каждую попытку, то ручная инъекция в попытке / ловушке после CDR вводится так же, как если бы это было указано в конструкторе.

Есть ли что-то особенное или особенное в CDR?Я не могу предоставить это, так как это исходит от Angular.Есть ли в этом что-то, что нужно привязать к дочернему классу?

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

Приложение:

Конкретная ошибка

StaticInjectorError(AppModule)[ChildComponent -> ChangeDetectorRef]:
  StaticInjectorError(Platform: core)[ChildComponent -> ChangeDetectorRef]:
    NullInjectorError: No provider for ChangeDetectorRef!

1 Ответ

0 голосов
/ 05 марта 2019

По причинам, которые не задокументированы, ChangeDetectorRef (а также ElementRef, ViewContainerRef и TemplateRef) не могут быть введены таким образом вручную.

См. https://github.com/angular/angular/issues/14656

ChangeDetectorRef должен оставаться введенным в дочерних классах и передаваться в super().

...