angular - Can Deactivate Guard 只能在 Angular 中运行一次
问题描述
是的,我知道这是一个duplicate issue
但以前的帖子并没有解决它。
守卫代码:
canDeactivate(component: ExamEndedComponent,
currentRoute: ActivatedRouteSnapshot, currentState: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
return this.store.select(fromRoot.getExamStatus)
.pipe(
take(1),
map((res: string) => {
console.log(res);
if (res === 'started') {
alert('stop');
console.log(currentState.url);
return false;
}
return true;
})
);
}
但问题是当点击back button
浏览器时,守卫只执行一次,所以当clicking again
用户实际上可以导航离开时。
还检查了 angular 中的问题:https ://github.com/angular/angular/issues/12851
但它尝试通过在返回 false 之前再次导航到当前路线来解决问题,如下所示:
canDeactivate(component: ExamEndedComponent,
currentRoute: ActivatedRouteSnapshot, currentState: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
return this.store.select(fromRoot.getExamStatus)
.pipe(
take(1),
map((res: string) => {
console.log(res);
if (res === 'started') {
alert('Deactivation blocked');
console.log(currentState.url);
this.router.navigate([currentState.url]);
return false;
}
return true;
})
);
}
此时 alert 被调用了两次,因为在返回 false 之前我导航到 currentState 所以角度运行 candeactivate 再次但是在再次单击后退按钮后 canDeactivate 没有被调用。路由表:
const appRoutes: Routes = [
{ path: 'Authentication', component: AuthComponent},
{path: '', redirectTo: 'home', pathMatch: 'full'},
{ path: 'home', component: HomeComponent, children: [
{path: '', redirectTo: 'exam', pathMatch: 'full'},
{path: 'exam', component: ExamComponent, children: [
{path: '', redirectTo: 'start', pathMatch: 'full'},
{path: 'start', component: ExamStartComponent},
{path: 'started', component: ExamQuestionsComponent,
canActivate: [ExamQuestionsGuard],
canDeactivate: [ExamStartedDeactivateGuard]},
{path: 'ended', component: ExamEndedComponent, canDeactivate: [ExamStartedDeactivateGuard]}
], resolve: {exam: ExamResolver}}
],
canActivate: [AuthGuard], resolve: {sign: SignInResolver}}
];
问题是什么 ?提前致谢 。
解决方案
推荐阅读
- python - 传递一个尚未创建的文件作为输入——Python
- python - 如何迭代熊猫数据框以将特定列中的值分配给字符串
- presto - Presto Superset 查询无法找到新存储帐户的配置属性
- r - 计算酒店的人数 (R)
- sql - 重复行,因为 1 列有多个不同的值
- r - R:如果满足条件,则将一个数据帧中的值替换为另一个数据帧中的值,否则附加跳过的数据
- javascript - eslint / typescript:无法解析模块的路径
- html - 基于图像高度 css 角度动态设置可变填充
- polygon - 多边形(Matic)web3 事务卡住
- git - Git 将更改从一个功能分支带到另一个功能分支