angular - 未在重定向的路由路径上调用 Angular Guard
问题描述
因此,可以通过多种方式进入我的应用程序。
http://localhost:4200 和 http://localhost:4200/home
如果指向我的应用程序(来自外部应用程序)的链接上有一个查询参数,我想抓住它。我创建了QueryParamCheckGuard
一个@Injectable({providedIn: 'root',})
. 现在,我只有一个console.log('In QueryParamCheckGuard');
in thecanActivate
和canActivateChild
方法来查看它何时被调用。现在,它不会在任何重定向的路径上被调用。
在我的应用程序中,我有子项目。主路由如下所示:
{
path: 'home',
canActivate: [QueryParamCheckGuard],
canActivateChild: [QueryParamCheckGuard],
data: {
path: 'App Home Path',
},
loadChildren:
'../../projects/home-app/src/app/app.module#HomeAppModule',
},
{
path: '',
canActivate: [QueryParamCheckGuard],
canActivateChild: [QueryParamCheckGuard],
data: {
path: 'App Empty Path',
},
redirectTo: '/home',
pathMatch: 'full',
}
在 HomeAppModule 中,路由是这样的:
{
path: 'home',
component: AppComponent,
canActivate: [QueryParamCheckGuard],
canActivateChild: [QueryParamCheckGuard],
data: {
path: 'Sub-proj Home Path',
},
children: [
{ path: '', component: HomePageComponent },
],
}
路由一切正常,但是当我输入 http://localhost:4200?id=test 时,不会在主应用程序的路由上调用 QueryParamCheckGuard,该path: ''
路由重定向到主应用程序path: 'home'
,并且在它到达子项目时path: 'home'
, id 查询参数被剥离。我知道它没有被其他路由调用,因为我向每个路径的数据添加了一个路径属性来标识每个路径。我那时console.log(route.data.path);
。
如果我点击 http://localhost:4200/home?id=test,QueryParamCheckedGuard 被点击,我可以获取 id 查询参数。除了要求所有外部应用程序调用 /home url 之外,我是否遗漏了一些东西来获取重定向到 home 以获取查询参数的路径?
解决方案
所以,我发现这是一个存在了大约 3 年的问题。 https://github.com/angular/angular/issues/18605 基本上,守卫不会在重定向的路径上被调用。
我的解决方法是更改redirectTo: '/home',
为
data: {
redirectTo: '/home',
},
children: [],
这样做的原因是children:[]
允许守卫被召唤。然后,在警卫中,我检查是否route.data.redirectTo
存在,如果存在,则返回 aUrlTree
中的值route.data.redirectTo
。
我还意识到更改主应用程序空路径上的重定向并没有做任何事情。我必须在 HomeAppModule 的路由上添加一个空检查并在那里进行。我现在可以获取查询参数并将它们保存起来,以备在重定向后被剥离时使用。
推荐阅读
- firebase - Flutter,内部流构建器,如何根据未来获取流?
- ios - Firebase 动态链接始终打开 App Store 而不是应用程序
- mongodb - Mongo change stream + Kafka vs Monga kafka Connector
- python - 如何编写一个 lambda 函数来计算具有熊猫 agg 函数中其他列条件的客户端的唯一计数
- bash - 我在 bash 中的 for 循环不计算文件和目录
- python - 用于评分的 Python 规则引擎
- python - asyncpg 接口错误服务器需要此查询的 2 个参数,已传递 1 个
- node.js - Electron JS 在后面运行耗时的过程
- pandas - Fast implementation of max value per user pandas
- javascript - Matter.js — SVG 分成多个部分