Программно создать угловой иерархический инжектор - PullRequest
0 голосов
/ 18 февраля 2019

В настоящее время я использую @Directive с набором провайдеров для создания изолированного инъекционного набора служб / значений для любого компонента без него.

@Directive({
  selector: '[my-isolated-directive]',
  providers: [MyHierarchicalService]
})
export class MyIsolatedDirective {}
<ng-container my-isolated-directive>
  <component-that-interacts-with-isolation></..>
  <component-that-requires-isolation></...>
</ng-container>

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

Мой вопрос: возможно ли сделать это программно без помощи директивы?Я знаю, что можно вручную создать инжектор с помощью Injector.create([MyHierarchicalService], parent), но можно ли разрешить использование этого инжектора для дочерних компонентов?

Невозможно просто переместить providers: [MyHierarchicalService] в компонент <component-that-requires-isolation>, посколькунесколько компонентов в этой изоляции потребуют одинакового обслуживания.Это можно рассматривать как «открытие пробела» в иерархическом инжекторе, где под ним все компоненты совместно используют один и тот же сервис.

Пример упрощенного стекаблица с моим текущим решением: https://stackblitz.com/edit/angular-zqxn4f

Фактическая директивас моим изолированным пространством, когда интересно: https://github.com/opf/openproject/pull/7042/files#diff-22f5fc2b9b761e556ed425d5e8b93fb4R70

Фактический код с использованием директивного решения: https://github.com/opf/openproject/pull/7042/files#diff-09e0b8f2cf13d8ecc8ccc45872068580R7

...