Angular 避免路由参数 (:id) 并导航到特定 link
Angular avoid Route parameter (:id) and navigate to specific link
在我们的项目中,如果激活维护模式,我必须实现导航或重定向到维护页面。
我想在 AuthGuard 服务中执行此操作,并执行以下操作:
canActivate(...) {
if (this.inMaintenance()) {
this._navController.navigateForward('settings-maintenance', { replaceUrl: true });
return false;
}
}
很遗憾,项目路由设置是这样的:
const routes: Routes = [
{
path: '',
loadChildren: () => import('./template/template.module').then((module) =>
module.TemplatePageModule),
canActivate: [AuthGuard],
},
{
path: 'settings-maintenance',
pathMatch: 'full',
component: SMaintenanceComponent,
},
{
path: ':id',
loadChildren: () => import('./template/template.module').then((module) =>
module.TemplatePageModule),
canActivate: [AuthGuard],
},
{
path: ':id/:params',
loadChildren: () => import('./template/template.module').then((module) => module.TemplatePageModule),
canActivate: [AuthGuard],
},
];
所以,每当我尝试导航到设置维护时,它都会再次攻击路由守卫,因为它认为它是 path: ':id'
。有没有办法避免这种情况?
我想避免显示登录页面并在没有登录的情况下直接重定向到 SMaintenance 页面,但不知道该怎么做。
否则,我将不得不在页脚左右检查维护模式,然后在登录后在那里进行重定向...
实际上,您的所有路径都将匹配第一个空路径。您始终需要包含带有空路径的 pathMatch: 'full'
,否则它将匹配任何内容。我想没有人注意到,因为他们都加载了相同的模块....
const routes: Routes = [
{
path: '',
loadChildren: () => import('./template/template.module').then((module) =>
module.TemplatePageModule),
canActivate: [AuthGuard],
pathMatch: 'full',
},
...
它应该按顺序检查路径匹配,所以它会在 :id 页面之前找到维护页面。
文档参考:https://angular.io/api/router/Route
The path-match strategy 'full' matches against the entire URL. It is important to do this when redirecting empty-path routes. Otherwise, because an empty path is a prefix of any URL, the router would apply the redirect even when navigating to the redirect destination, creating an endless loop.
没有 pathMatch: 'full'
的空路径通常作为最后一条路由出现,用于捕获任何不存在的路由,重定向或显示 404 页面。
在我们的项目中,如果激活维护模式,我必须实现导航或重定向到维护页面。 我想在 AuthGuard 服务中执行此操作,并执行以下操作:
canActivate(...) {
if (this.inMaintenance()) {
this._navController.navigateForward('settings-maintenance', { replaceUrl: true });
return false;
}
}
很遗憾,项目路由设置是这样的:
const routes: Routes = [
{
path: '',
loadChildren: () => import('./template/template.module').then((module) =>
module.TemplatePageModule),
canActivate: [AuthGuard],
},
{
path: 'settings-maintenance',
pathMatch: 'full',
component: SMaintenanceComponent,
},
{
path: ':id',
loadChildren: () => import('./template/template.module').then((module) =>
module.TemplatePageModule),
canActivate: [AuthGuard],
},
{
path: ':id/:params',
loadChildren: () => import('./template/template.module').then((module) => module.TemplatePageModule),
canActivate: [AuthGuard],
},
];
所以,每当我尝试导航到设置维护时,它都会再次攻击路由守卫,因为它认为它是 path: ':id'
。有没有办法避免这种情况?
我想避免显示登录页面并在没有登录的情况下直接重定向到 SMaintenance 页面,但不知道该怎么做。
否则,我将不得不在页脚左右检查维护模式,然后在登录后在那里进行重定向...
实际上,您的所有路径都将匹配第一个空路径。您始终需要包含带有空路径的 pathMatch: 'full'
,否则它将匹配任何内容。我想没有人注意到,因为他们都加载了相同的模块....
const routes: Routes = [
{
path: '',
loadChildren: () => import('./template/template.module').then((module) =>
module.TemplatePageModule),
canActivate: [AuthGuard],
pathMatch: 'full',
},
...
它应该按顺序检查路径匹配,所以它会在 :id 页面之前找到维护页面。
文档参考:https://angular.io/api/router/Route
The path-match strategy 'full' matches against the entire URL. It is important to do this when redirecting empty-path routes. Otherwise, because an empty path is a prefix of any URL, the router would apply the redirect even when navigating to the redirect destination, creating an endless loop.
没有 pathMatch: 'full'
的空路径通常作为最后一条路由出现,用于捕获任何不存在的路由,重定向或显示 404 页面。