Динамический компонентный преобразователь 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
должен быть введен здесь.