Динамический компонентный преобразователь angular5

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

Поскольку я не могу использовать маршруты для достижения этой цели, я создал сервис, который дал moduleName :string и compomnentName : string возвращает соответствующий класс компонента.

Увидеть ComponentDirectoryService в этом стеке.

Я имитирую, как модуль маршрутизатора позволяет функциональным модулям вводить свои собственные маршруты:

  • ComponentDirectoryModule имеет forRoot а также forChild методы, к которым DIRECTORY_ENTRIES значение передается
  • каждый функциональный модуль (p1 и p2 в stackblitz) вызывает forChild обеспечить его DIRECTORY_ENTRIES
  • AppModule звонки forRoot который обеспечивает ComponentDirectoryService переходя в кумулятивный forChild) ценность DIRECTORY_ENTRIES

Все отлично работает в режиме разработки.

В рабочем режиме все работает, но я получаю это страшное предупреждение:

Не удается разрешить все параметры для ComponentDirectoryService в...component-directory.service.ts: (?). Это станет ошибкой в ​​Angular v6.x

Что меня озадачивает, так это то, что единственным параметром службы являются записи каталога...

РЕДАКТИРОВАТЬ 1

Как Angular объявляет токен ROUTES:

export const ROUTES = new InjectionToken<Route[][]>('ROUTES');

я тоже для DIRECTORY_ENTRIES:

export const DIRECTORY_ENTRIES = new InjectionToken<ComponentDirectoryEntry[][]>('DIRECTORY_ENTRIES');

1 ответ

Решение

Компилятор пропускает информацию о том, что на самом деле должно быть введено в ваш сервис.

Вот почему вам нужно явно использовать @Inject(<YOUR_INJECTION_TOKEN>) декоратор, чтобы указать на это:

constructor(@Inject(DIRECTORY_ENTRIES) private entries: ComponentDirectoryEntry[]) { }

Это внутренне установит флаг метаданных для свойства entries и используя эти метаданные Angular будет знать, что DIRECTORY_ENTRIES должен быть введен здесь.

Другие вопросы по тегам