Угловая 10-я вспомогательная розетка маршрутизатора не работает при установке в модуль с отложенной загрузкой

У меня проблема с второй розеткой маршрутизатора, когда она создается в модуле с отложенной загрузкой.

Я начал с этого примера, где вспомогательные маршруты https://stackblitz.com/edit/angular-nested-auxiled-routes-irixxy работают правильно.

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

Чтобы проверить, не связана ли проблема с маршрутизацией моего приложения, я создал пример https://stackblitz.com/edit/angular-nested-auxiled-routes-bpuswu, который похож на базовый пример, но с добавленным модулем с отложенной загрузкой, в котором настроена маршрутизация (первичная и вторичная). Проблема в том, что ссылки со вторичным выходным путем не работают, что приводит к ошибке Cannot match any routes. URL Segment: 'level-0'. Созданные недействительные ссылки похожи на [...]/level-0/(level-1//outlet1:aux-1). Та же проблема была в моем проекте приложения.

У кого-нибудь есть подобная проблема и знает, как ее исправить? Что-то не так с моим распорядком? Или это баг в роутере?


person user3626048    schedule 11.05.2021    source источник


Ответы (3)


Я думаю, что ваши ссылки неверны:

Попробуйте следующее: ‹a [routerLink visible=['/level-0/level-1', {outlets: {outlet1:'aux-1'}} ]›› L1-A1 |

А также в шаблонах должно быть основное и вспомогательное:

   <router-outlet></router-outlet>
<router-outlet name="outlet1"></router-outlet>`
person rekna    schedule 13.05.2021
comment
ваша ссылка тоже не работает. выход1 маршрутизатора находится в компоненте Level0Component. - person user3626048; 13.05.2021

Эта проблема

Мне удалось изолировать проблему до линии

 outlet2: 'aux-3'

Если мы проверим ссылку, созданную для <a [routerLink]="['/level-0', { outlets: { primary: ['level-1', { outlets: { primary: ['level-2', { outlets: { primary: ['level-3'], outlet2: 'aux-3' } }] } }], outlet1: 'aux-1' } }]">L1-A1/L2/L3-A3</a>, мы увидим, что она производит

/level-0/(level-1/(level-2/(level-3//outlet2:a/u/x/-/3))//outlet1:aux-1)

Похоже, aux-3 конвертируется в a/u/x/-/3. чего точно не ожидают. Похоже, буквы были разделены и соединены с /.

Решение / обходной путь

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

 outlet2: ['aux-3']

<a [routerLink]="['/level-0', { outlets: { primary: ['level-1', { outlets: { primary: ['level-2', { outlets: { primary: ['level-3'], outlet2: ['aux-3'] } }] } }], outlet1: ['aux-1'] } }]">L1-A1/L2/L3-A3</a>

Теперь создается правильная ссылка и маршруты работают правильно

Что-то не так с моей маршрутизацией?

Ваши маршруты работают правильно. Но, как вы могли заметить, существует некоторая несогласованность в способе создания ссылок. Я попробовал простую ссылку на маршрутизатор в Этот Stackblitz и выдает ту же ссылку.

<a [routerLink]="['/', { outlets: { outlet1: ['ab'] } }]">Link 1|</a> <br />
<a [routerLink]="['/', { outlets: { outlet1: 'ab' } }]">Link 2</a>

Ниже приведен результат реализации вышеуказанного

Вспомогательные маршруты для модулей с отложенной загрузкой

Простое объяснение проблемы, с которой вы столкнулись, выделено в этом вопросе Именованный выход маршрутизатора и ленивые загруженные модули со ссылкой, приведенной в этом ответе https://stackoverflow.com/a/49367379/13680115 т.е. дополнительные маршруты не поддерживаются из коробки

Вспомогательный модуль с отложенной загрузкой № 10981

В этом сообщении выше, в этом комментарии пользователь выделяет ниже

Кажется, что ленивая загрузка и вспомогательные маршруты не используются широко вместе. Мы можем увидеть много демо, но это все. Как будто никто не использует его в средних / больших приложениях ????

В том же сообщении, похоже, есть обходной путь здесь

Мы создаем вложенный маршрут с родительским маршрутом без компонентов. Я реализовал это в демонстрации ниже, и это работает для модуля с ленивой загрузкой 1-го уровня. Для следующего уровня маршруты правильно сопоставляются без ошибок, но, к сожалению, компонент не загружен, я считаю, что решение состоит в том, чтобы просто переместить один уровень в родительский компонент. Таким образом, один уровень вспомогательных маршрутов загружается в родительский модуль, а другой - в ленивый загружаемый модуль.

< / strong>

person Owen Kelvin    schedule 14.05.2021
comment
вы сосредоточились на основном примере проекта без модуля, но моя проблема в том, что маршрутизация, которая работала в основном примере (ссылки L1-A1 и L1-A2 с выходом 1), перестала работать после перемещения маршрутизации в новый модуль, который я показал во втором примере. Вы можете проверить это? - person user3626048; 14.05.2021
comment
Можете ли вы взглянуть на обновленное решение - person Owen Kelvin; 14.05.2021
comment
Я проверил вашу демонстрацию, но она все еще не работает. Может, вы что-то забыли сохранить на stackblitz? Также пытался скопировать ваши ссылки, указанные выше, но это тоже не сработало. Но после того, как я переместил маршрутизатор outlet1 на Level1Component, он начал работать (с вашими ссылками). Я создал этот пример stackblitz.com/edit/angular-nested-auxillion- routes-khaywj Единственное, что я не мог сделать, это связать с розеткой1 и розеткой2 в одной ссылке, есть идеи, как это сделать? - person user3626048; 17.05.2021
comment
Вы можете проверить мой обновленный ответ, похоже, ленивая загрузка и вспомогательные маршруты не поддерживаются из коробки, так как они редко используются вместе - person Owen Kelvin; 19.05.2021
comment
хорошо, я думаю, это все объясняет. Спасибо за помощь. - person user3626048; 20.05.2021

Неужели важно иметь разные роутеры? Могу я спросить, в чем причина? Мне удается заставить его работать с одним роутером. Вы можете проверить это?

Вот обновленный пример: https://stackblitz.com/edit/angular-nested-auxillion-routes-w1tcn4?file=src/app/app.component.html

person Nenad Milosavljevic    schedule 18.05.2021
comment
в своем приложении я хочу использовать Material Angular Sidenav material.angular.io/components/sidenav/overview с некоторыми статическими параметрами на боковой панели, ниже некоторого компонента, зависящего от маршрута (второй выход) и основного выхода маршрутизатора на элементе содержимого. Есть ли какое-нибудь решение сделать это без дополнительного маршрутизатора Outler? - person user3626048; 18.05.2021
comment
Вы можете уточнить? У вас будет Angular Sidenav с некоторыми опциями. У вас будет роутер с розеткой для контента. Что еще? Я не понимаю роли с route-dependent component (second outlet) . - person Nenad Milosavljevic; 18.05.2021
comment
примерно так: i.postimg.cc/TY4c8R7k/project.jpg - например, первичный выход должен отображать компонент списка клиентов, а вторичный выход должен отображать форму клиентов. компонент меню одинаков для всех маршрутов - person user3626048; 18.05.2021
comment
Должен ли вспомогательный маршрутизатор изменять содержимое на основе содержимого основного маршрутизатора или независимо? - person Nenad Milosavljevic; 19.05.2021
comment
Я думаю, было бы достаточно, если бы первичный и вторичный выходы менялись вместе, поэтому продолжу мой пример: route / ser / clients должны показывать список клиентов в основном выходе, а форма клиентов - во вторичном; на другом маршруте, таком как / ser / container, должен отображаться список контейнеров на первичном выходе, а форма контейнеров - на вторичном выходе и т. д. - person user3626048; 19.05.2021