angular支持多种路由守卫,可以实现在路由跳转过程中的一些处理。
路由守卫会返回一个值,用来控制接下来的行为:
如果它返回 true,导航过程会继续
如果它返回 false,导航过程就会终止,且用户留在原地。
如果它返回 UrlTree,则取消当前的导航,并且开始导航到返回的这个 UrlTree.
路由器可以支持多种守卫接口:
- 用CanActivate来处理导航到某路由的情况。
- 用CanActivateChild来处理导航到某子路由的情况。
- 用CanDeactivate来处理从当前路由离开的情况.
- 用Resolve在路由激活之前获取路由数据。
- 用CanLoad来处理异步导航到某特性模块的情况。
在每个层级的路由上都可以设置多个路由守卫。路由器会先从最深的子路由由下往上的顺序检查 CanDeactivate() 和 CanActivateChild() 守卫。 然后它会按照从上到下的顺序检查 CanActivate() 守卫。 如果特性模块是异步加载的,在加载它之前还会检查 CanLoad() 守卫。 如果任何一个守卫返回 false,其它尚未完成的守卫会被取消,这样整个导航就被取消了。
注意路由守卫的执行顺序很重要。在路由层级上面使用多个路由守卫时,必须要注意执行顺序,避免因为执行顺序原因导致路由行为不符合预期行为