Использование forChild и forRoot с модулем маршрутизатора

#angular #angular-routing

#angular #angular-маршрутизация

Вопрос:

Я немного запутался в поведении дочерних элементов forRoot и forChild при работе с RouterModule.

Если я использую RouterModule.forChild (маршруты) внутри модуля маршрутизации и импортирую его в app.module.ts, а затем, если я попытаюсь использовать router-outlet внутри app.component.ts, он выдает ошибку.

Согласно определению :

forChild создает модуль, который содержит все директивы и заданные маршруты, но не включает службу маршрутизатора.

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

Но если то же самое делается внутри функционального модуля, это работает нормально.

Извините, что не публикую код, так как он будет длинным.

Комментарии:

1. Вы импортируете только RouterModule.forChild (маршруты), а не forRoot()? Какую ошибку вы получаете от Angular?

2. Нет поставщика для ChildrenOutletContexts!, Я просто хотел получить глубокую концепцию, поэтому я попытался выполнить RouterModule.forChild (маршруты), обычно в главном модуле вы должны выполнить RouterModule.forRoot.

Ответ №1:

RouterModule.forRoot() должно быть там в AppModule . Это тот, который создает экземпляры служб маршрутизатора. Все остальные модули будут использовать RouterModule.forChild([]) для обработки маршрутизации.

У вас должно быть только одно forRoot использование в приложении.

Комментарии:

1. forRoot создаст экземпляр службы маршрутизатора, с чем я согласен, но если вы видите код angular router git hub. github.com/angular/angular/blob/master/packages/router/src/… (Строка № 94, в ней говорится, что она будет предоставлять директивы), поэтому меня больше беспокоит, почему он не может найти директиву router-outlet.

2. Это потому, что провайдер ChildrenOutletContexts является частью ROUTER_PROVIDERS . Это зависимость только при использовании forRoot . не при использовании forChild . router-outlet Требуется экземпляр ChildrenOutletContexts , но поскольку он не предоставляется forChild , вы получите сообщение об ошибке.

3. Тогда как то же самое работает для функционального модуля?, берется ли это из модулей приложений

4. Это нигде не должно работать, пока не будет использован forRoot . Пожалуйста, воспроизведите это на stackblitz, если у вас получится.

5. Если вы используете forRoot в AppModule, все экземпляры доступны для использования функциональным модулем.

Ответ №2:

Проверьте исходный кодмаршрутизатора.

forChild регистрирует маршруты, тогда как forRoot регистрирует маршруты и настраивает / инициализирует сам маршрутизатор