Angular 角度路由只能通过路由器访问。导航
是否可以创建一个角形CanActivate防护装置,仅当我通过Angular 角度路由只能通过路由器访问。导航,angular,Angular,是否可以创建一个角形CanActivate防护装置,仅当我通过路由器导航到它时,它才允许用户访问路由。导航 例如: 用户创建一个帐户,可以显示两个组件:RegistrationForm和ConfirmationForm。它们都将其特定路由配置为“registrationForm”、“confirmationForm”。我希望确认表单只有在用户通过注册表单时才可访问,并且在成功注册时我使用路由器。导航('ConfirmationForm')。我希望在用户将www.someURL.com/confi
路由器导航到它时,它才允许用户访问路由。导航
例如:
用户创建一个帐户,可以显示两个组件:RegistrationForm和ConfirmationForm。它们都将其特定路由配置为“registrationForm”、“confirmationForm”。我希望确认表单只有在用户通过注册表单时才可访问,并且在成功注册时我使用路由器。导航('ConfirmationForm')
。我希望在用户将www.someURL.com/confirmationForm放入浏览器地址栏时阻止它。为什么不将这两个表单合并到一个组件中,并根据注册结果使用*ngIf
隐藏/显示部分灵感来自jacekbj对原始问题的评论,
我就是这样做的:
首先,我创建了类CanShowConfirmationForm:
import { Injectable } from '@angular/core';
import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, Router }
from '@angular/router';
@Injectable({
providedIn: 'root'
})
export class CanShowConfirmationForm implements CanActivate {
constructor(private router: Router) { }
canActivate(
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot): boolean {
const url: string = state.url;
alert("current url" + this.router.url);
return this.checkLogin(url);
}
checkLogin(url: string): boolean {
if (this.router.url === "/register") { return true; }
this.router.navigate(['/login']);
return false;
}
}
然后我修改了app-routing模块app-routing.module.ts
导入刚创建的类
import { CanShowConfirmationForm } from './can.show.confirmation.form';
然后我通过添加属性修改了组件注册SuccessComponent的路由(在您的示例中,该组件命名为ConfirmationForm)
可以使用值[CanShowConfirmationForm]激活:
{
path: 'registration-success',
canActivate: [ CanShowConfirmationForm],
component: RegistrationSuccessComponent,
data: { title: 'RegistrationSucess' }
}
(在您的示例中,成功注册被重定向到url/confirmationForm,在我的示例中重定向到url/registration success。)
现在,如果我尝试直接访问url,浏览器将指向url,并且在成功注册后,将显示注册成功视图。我想,这也是你想要的。你有没有考虑过使用一个服务来存储一个标志,即“代码> CANEngestRealfMyStase<代码>?然后你可以在注册表单中设置它,并在Guard中使用。我想我会这样做,因为这是迄今为止我发现的最好的解决方案,我需要两个组件的不同路径。