首页 > 编程知识 正文

angular2 全局路由守卫Angular 路由守卫,全局路由守卫写在哪

时间:2023-05-03 19:43:15 阅读:249233 作者:4104

1. 路由

Angular路由: 可以控制页面跳转;可以在多视图间切换;

2. 路由守卫

Angular路由守卫: 在进入或离开某路由时,用于判断是否可以离开、进入某路由;;; return true 代表可以进入当前路由;return false 代表不可以进入当前路由,但可以进入自定义的路由;

3. 路由守卫与路由的关系

路由守卫只只能应用于路由项上;路由守卫可以应用于多个路由项;每个路由项也可以有多个路由守卫;

路由守卫通过实现如下接口来操作:

canActivate: 控制是否允许进入路由。(通过return true/false决定)

canActivateChild: 等同 canActivate,只不过针对是所有子路由。

canDeactivate: 控制是否允许离开路由。

canLoad: 控制是否允许延迟加载整个模块。

4. 什么情况下,路由项上需要配置路由守卫属性

当需要某些条件/某个身份才能进入的路由,这时需要在路由项上加入路由守卫属性

5. 路由守卫的使用 (本例主要实现根据不同身份进入不同路由)

第一步: guard.service.ts - 定义路由守卫文件

第一种写法: 返回Promise对象

@Injectable()

export class GuardService implements CanActivate {

constructor(private router: Router, private _http: HttpClient) {

}

getIsAdmin() {

return new Promise((resolve) => {

this._http.get('/user/isAdmin').subscribe((resp: boolean) => {

resolve(resp);

});

});

}

// 进入路由守卫

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable | Promise | boolean {

return this.getIsAdmin().then((isAdmin) => {

if (isAdmin) { // 如果是管理员, 可以进入当前路由;

return true;

} else {

// 如果不是管理员,不能进入当前路由,进入手动导航的ordinary路由;

this.router.navigateByUrl('/ordinary');

return false;

}

});

}

}

第二种写法: 返回Observable对象

@Injectable()

export class GuardService implements CanActivate {

constructor(private router: Router, private _http: HttpClient) {

}

// 进入路由守卫

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable | Promise | boolean {

return this._http.get('/user/isAdmin').map((isAdmin) => {

if (isAdmin) { // 如果是管理员, 可以进入当前路由;

return true;

} else {

// 如果不是管理员,不能进入当前路由,进入手动导航的ordinary路由;

this.router.navigateByUrl('/ordinary');

return false;

}

});

}

}

第二步: app.module.ts - 注册路由文件

@NgModule({

declarations: [AppComponent],

providers: [

GuardService

],

bootstrap: [AppComponent]

})

第三步: app.routing.ts - 给对应的路由项配置路由守卫

// 当导航到front时,需要进入路由守卫的canActivate类进行判断是否可以进入此路由

// 什么时候需要在路由项上加路由守卫??当需要某些条件/某个身份才能进入的路由,这时需要在路由项上加入路由守卫属性

export const routes: Routes = [

{

path: '',

component: AppComponent,

children: [

{path: '', redirectTo: 'front', pathMatch: 'full'},

{path: 'front', component: FrontendComponent, canActivate: [GuardService]},

{path: 'ordinary', component: OrdinaryComponent}

]

},

];

@NgModule({

imports: [RouterModule.forRoot(routes, {useHash: true})],

exports: [RouterModule]

})

export class RoutingModule {

}

Prometheus-第一部分-docker安装步骤

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。