<强>引言强>
在企业应用中权限,复杂页多路由数据处理,进入与离开路由数据处理这些是非常常见的需求。
当希望用户离开一个正常编辑页时,要中断并提醒用户是否真的要离开时,如果在角中应该怎么做呢?
其实角路由守卫属性可以帮我们做更多有意义的事,而且非常简单。
<强>什么是路由守卫? 强>
角的<代码> 代码>路路线由参数中除了熟悉的<代码>路径> 代码,代码> <代码>组件外,还包括四种是否允许路由激活与离开的属性。
<强> canActivate 强>
控制是否允许进入路由。
<强> canActivateChild 强>
等同canActivate,只不过针对是所有子路由。
<强> canDeactivate 强>
控制是否允许离开路由。
<强> canLoad 强>
控制是否允许延迟加载整个模块。
例如:
代码如下:
{路径:“逻辑”,loadChildren:“。/逻辑/逻辑。模块# LogicsModule ', canLoad: [AuthGuard]}
这四个属性非常好理解,而且作用各自不同,然后当进入与离开能够有效控制权时,对于前面我提到的若干问题,就可以非常好的处理。
<>强如何创建? 强>
四个属性虽然名称不同,但其基本的使用方式非常相近。四种不同守卫方式有者四个不同的接口与之相对应。
属性名
接口名
canActivate
CanActivate
canActivateChild
CanActivateChild
canDeactivate
CanDeactivate
<代码> canDeactivate> 代码需要指明具体的组件类名以外,其他接口只是将首字母大写而已。假定需要一个某个角色才能访问某些路由,就需要一个<代码> CanActivate 代码>守卫类。
@Injectable () 出口类CanAdminProvide实现CanActivate { 构造函数(私人userSrv: UserService私人味精:NzMessageService) {} canActivate ( 路线:ActivatedRouteSnapshot, 状态:RouterStateSnapshot):布尔| Observable| Promise { 返回新观测((观察者)=比;{//拥有“admin”角色 如果(this.userSrv.hasRole('管理')){ observer.next(真正的); observer.complete (); 返回; } this.msg.error(“授权不足”); observer.next(假); observer.complete (); }); } } >之前 每种接口要都需要相应的实现某个方法,就上而论,继承CanActivate并实现一个叫CanActivate的方法,且返回一个布尔类型的值。
四种类型守卫接口都返回一个布尔类型值,其实从这四种参数的名称可以开头就不然理解。
最后,把它运用到相应的路由上即可,例如:
代码如下:
{路径:“admin”,组件:GuardAdminComponent canActivate: [CanAdminProvide]}
当然,别忘记注册CanAdminProvide类。
<强>一些实践强>
<强>离开时提醒强>
四种守卫只有一种离开类型<代码> canDeactivate> 代码,因此:
@Injectable () 出口类CanLeaveProvide实现CanDeactivate{ 构造函数(私人confirmSrv: NzModalService) {} canDeactivate ( 组件:GuardComponent, currentRoute: ActivatedRouteSnapshot, 现状后:RouterStateSnapshot, nextState& # 63;: RouterStateSnapshot):布尔| Observable | Promise { 返回新观测((观察者)=比;{ this.confirmSrv.confirm ({ 标题:“确认要离开吗?’, 内容:“你已经填写了部分表单离开会放弃已经填写的内容。’, okText:“离开”, cancelText:“取消”,>//允许 observer.next(真正的);//或拒绝//observer.next(假); observer.complete (); >之前 来处理可观测的结果,就完成了整个流程。倘若,用户按浏览器后退或路由至其他页面时,会先收到一个提醒。
上面使用的ng-zorro-antd的确认对话框来提醒用户是否需要离开,若选择【离开】则跳转至目标路,由反之保留当前路由状态。