angular - 单击路由器时防止重定向到组件
问题描述
我有两个组件:
学期计划:
onSubmit(student: Student) {
this.studentService.postStudent(student).subscribe((s) => {
this.router.navigate(['home-page/semester-planning/classes-planning/' + s.id]);
});
}
还有从学期计划重定向而来的课程计划,它通过 id 获取学生,然后显示信息:
ngOnInit(): void {
this.studentId = this.route.snapshot.paramMap.get('id');
}
ngAfterViewInit(): void {
this.getStudent().subscribe(student => {
this.dateProcessed = this.processDate(student.startDate, student.endDate);
})
}
getStudent(): Observable<Student> {
return this.studentService.getStudent(this.studentId);
}
这是两个组件的路由器:
{
path: 'semester-planning',
component: SemesterPlanningComponent,
canActivate: [AuthGuard, StudentGuard],
},
{
path: 'semester-planning/classes-planning/:id',
component: ClassesPlanningComponent,
canActivate: [AuthGuard],
}
这很好用,除非用户已经导航到课程计划并单击进入学期计划,并且尽管已经提交了数据,但他们再次被重定向到该页面。
如果用户已经提交了数据并导航到课程计划,我想防止重定向到学期计划。我尝试在下面创建学生警卫,但不知道如何检查学生是否已经提交了数据(导航到课程计划)。使用 localStorage 没问题,但如果用户切换浏览器,那么它将不再工作。
canActivate(
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
if (
// check if the student submitted the data?
) {
this.router.navigate(['home-page/semester-planning/classes-planning/']);
return false;
}
return true;
}
与服务器交互的学生服务代码(如果方便的话):
getStudent(id: String): Observable<Student> {
const student = this.http.get<Student>(environment.baseUrl + "/api/student/" + id);
return student;
}
postStudent(student: Student): Observable<any> {
return this.http.post(environment.baseUrl + "/api/student", student);
}
我真的很感激一些帮助。
解决方案
当应用程序重新加载或直接从 URL 访问时,Angular 不会保存统计信息,这就是为什么您必须在<a>
标签上使用 routerlink 属性来导航的原因。不知道你用的是routerlink还是href。这不是实际问题,但正如您所说,您可以使用 localStorage 或者您可以在后端进行验证(更好)。我不知道您所说的“使用 localStorage 可以,但如果用户切换浏览器,那么它将不再工作”是什么意思。如果您想将此类信息保存在不同的浏览器中,则必须将其保存在数据库中。
这个 Youtube 视频可以帮助你了解如何在 Angular 应用Angular 6 教程 19:持久登录会话中持久化数据
推荐阅读
- kotlin - Dagger 2 @Singleton 在 LibGDX (kotlin) 中不起作用
- r - 在 R 中循环以更改数据框列的类别
- javascript - Postgres:将 pg_notify 与 `node-postgres` Javascript 库一起使用时未收到有效负载
- java - 如何以编程方式选择 ClientRegistration
- node.js - PM2 在进程崩溃后启动一个新的守护进程并且不重新启动进程
- python - 'list' 对象没有属性'get' - GraphQL Python
- r - 使用 ggplot2 中的条形图在组内重新排序不起作用
- excel - 使用 Excel VBA 中的按钮执行多个模块
- machine-learning - 分层分裂训练/测试 - H2O
- angular-material - Angular 9材料组件问题