Angular - 如何"exit"一个组件?
Angular - how to "exit" a component?
假设我有一个需要身份验证的组件(实际上该组件的某些实例需要身份验证,其他不依赖于 "id" 路由实例变量):
ngOninit() {
const id = +this.activatedRoute.snapshot.params.id;
this.isSecured = requiresAuthentication(id);
if (this.isSecured && !this.authService.isLoggedIn()) {
this.router.navigate(['/login']);
}
//very private data loading code
问题是我的其余代码总是被执行(如果此组件不安全或用户已登录,这很好)。但是当 "if" 条件为真时(导航到登录页面时),我在 ngOninit() 方法中的其余代码仍然执行。
问题出在您验证会话或用户身份验证的模式中。 Angular 提出的理想模式是如果不满足访问条件则不assemble 组件。
例如:
class UserToken {}
class Permissions {
canActivate(user: UserToken, id: string): boolean {
return true;
}
}
@Injectable()
class CanActivateTeam implements CanActivate {
constructor(private permissions: Permissions, private currentUser: UserToken) {}
canActivate(
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot
): Observable<boolean>|Promise<boolean>|boolean {
return this.permissions.canActivate(this.currentUser, route.params.id);
}
}
@NgModule({
imports: [
RouterModule.forRoot([
{
path: 'team/:id',
component: TeamCmp,
canActivate: [CanActivateTeam]
}
])
],
providers: [CanActivateTeam, UserToken, Permissions]
})
class AppModule {}
if(this.isSecured && this.authService.isLoggedIn()) {
// sensitive stuff
} else {
this.router.navigate(['/login']);
}
假设我有一个需要身份验证的组件(实际上该组件的某些实例需要身份验证,其他不依赖于 "id" 路由实例变量):
ngOninit() {
const id = +this.activatedRoute.snapshot.params.id;
this.isSecured = requiresAuthentication(id);
if (this.isSecured && !this.authService.isLoggedIn()) {
this.router.navigate(['/login']);
}
//very private data loading code
问题是我的其余代码总是被执行(如果此组件不安全或用户已登录,这很好)。但是当 "if" 条件为真时(导航到登录页面时),我在 ngOninit() 方法中的其余代码仍然执行。
问题出在您验证会话或用户身份验证的模式中。 Angular 提出的理想模式是如果不满足访问条件则不assemble 组件。
例如:
class UserToken {}
class Permissions {
canActivate(user: UserToken, id: string): boolean {
return true;
}
}
@Injectable()
class CanActivateTeam implements CanActivate {
constructor(private permissions: Permissions, private currentUser: UserToken) {}
canActivate(
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot
): Observable<boolean>|Promise<boolean>|boolean {
return this.permissions.canActivate(this.currentUser, route.params.id);
}
}
@NgModule({
imports: [
RouterModule.forRoot([
{
path: 'team/:id',
component: TeamCmp,
canActivate: [CanActivateTeam]
}
])
],
providers: [CanActivateTeam, UserToken, Permissions]
})
class AppModule {}
if(this.isSecured && this.authService.isLoggedIn()) {
// sensitive stuff
} else {
this.router.navigate(['/login']);
}