У меня проблема с Angular (8), когда маршрутизатор будет перезагружать весь маршрут (т. Е. Родительский) при навигации по children
маршрутам родительского маршрута.Ожидаемое поведение заключается в том, что родительский маршрут не будет уничтожен / перезагружен, а дочерние маршруты будут просто отображаться на основе маршрута.
Странно то, что этого не происходит, когда мое приложение загружает любой путь из родительского маршрута и ниже.Это происходит только при запуске с маршрута вне маршрутов модуля, на которые я ссылаюсь.То есть модуль, на который я ссылаюсь, является лениво загруженным функциональным модулем, и если я перехожу к функциональному модулю из корня приложения (или из любого места между корнем приложения и функциональным модулем), возникает проблема.Если я загружаю приложение из маршрута в модуле функций и перемещаюсь по маршрутам этого модуля, проблема не возникает.
Мои лениво загруженные маршруты модулей функций выглядят следующим образом:
const routes: Routes = [
{
path: ':rid',
component: Feature_Root_Component,
children: [
{
path: '',
component: Feature_Component_Home,
},
{
path: 'foo',
component: Feature_Foo_Component
},
{
path: 'bar',
component: Feature_Bar_Component
},
{
path: 'baz/:bid',
component: Feature_Baz_Component,
}
],
},
];
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule]
})
export class Feature_Routing_Module { }
Маршруты приложений:
const routes: Routes = [
{
path: 'feature-module',
canLoad: [User_Guard],
loadChildren: () => import('./feature.module').then(mod => mod.Feature_Module)
},
{
path: '',
canLoad: [User_Guard],
loadChildren: () => import('./home/home.module').then(mod => mod.Home_Module),
},
{
path: '**',
redirectTo: '',
},
];
@NgModule({
imports: [
RouterModule.forRoot(
routes,
{
// enableTracing: true, // Debugging only.
preloadingStrategy: Selective_Preload_Strategy_Service,
paramsInheritanceStrategy: 'always',
},
)
],
exports: [RouterModule]
})
export class App_Routing_Module { }
Итак, как я уже говорил, если я перейду прямо к feature-moduoe/:rid
(через URL или просто перезагрузлю, находясь на этом маршруте), а затем перейду к foo
, bar
,baz/:bid
или просто пустой путь, поведение соответствует ожидаемому, и дочерние компоненты будут заменены.
Однако, если я начну переходить от за пределами к функциональному модулю (скажем, из корня приложения /
) к маршруту функционального модуля, любая последующая маршрутизация в функциональном модуле вызовет функциюмодуль для перезагрузки при каждой навигации.Т.е. Feature_Root_Component
уничтожит и повторно инициализирует.
Это нормальное поведение, или я иду по моему маршруту неправильно?
Обновление 1
Я узнал пару вещей.Если я переместу навигацию (то есть <a>
, содержащую routerLink
) в корень приложения, и перейду, проблема действительно возникает.В настоящее время ссылка находится в другом загруженном ленивом модуле функций.Маршрутизация из другого функционального модуля вызовет проблему, тогда как навигация из корня приложения не будет.
Обновление 2 Просто еще больше сузили проблему.При перемещении навигации к модулю home
она также работает правильно.Проблема была сужена до сбоя при соединении с feature-module
из лениво загруженного модуля, вложенного в home
.
Для иллюстрации приведена иерархия маршрутов:
// app routing
-feature-mod <-- I navigate to here
-home-mod
-''
-lazy-mod-1
-lazy-mod-2 <-- from here
Переход от lazy-mod-2
к feature-mod
завершится неудачно и приведет к тому, что последующая маршрутизация внутри дочерних маршрутов feature-mod
будет перезагружать корневой компонент feature-mod
при каждой навигации.Я проверил это, войдя в систему из конструктора корневого компонента.
Однако навигация из корня приложения или lazy-mod-1
будет работать нормально.То есть маршруты feature-mod
не будут вызывать перезагрузку корневого компонента при маршрутизации.