# angular路由守卫
## 1、CanActivate
进入路由时拦截
建立实现CanActivate接口的文件
~~~
import {CanActivate} from "@angular/router";
export class CanActivateGuard implements CanActivate{
canActivate(){
return window.confirm("是否进入");
}
}
~~~
打开app.module.ts;注入服务
~~~
providers: [CanActivateGuard],
~~~
打开路由配置文件添加守卫
~~~
const routes: Routes = [
{
path:'',
redirectTo:'/index',
pathMatch:'full'
},
{
path: 'index',
component:Tab1Component
},
{
path: 'secound',
component:Tab2Component,
canActivate:[CanActivateGuard]
},
];
~~~
html中a标签
~~~
<a [routerLink]="['/index']">首页</a>
<a [routerLink]="['/secound']" >CanActivate</a>
<router-outlet></router-outlet>
~~~
点击CanActivate弹出弹窗
![这里写图片描述](https://img-blog.csdn.net/20180814114527468?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTk1MjE5OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
点击取消
![这里写图片描述](https://img-blog.csdn.net/20180814115209243?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTk1MjE5OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
点击确定进入
![这里写图片描述](https://img-blog.csdn.net/20180814115610919?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTk1MjE5OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
## 2、canDeactivate
离开路由时拦截
建立实现CanDeactivate接口的文件
~~~
import {CanDeactivate} from "@angular/router";
import {Tab2Component} from '../tab2/tab2.component';
export class CanDeactivateGuard implements CanDeactivate<Tab2Component>{
canDeactivate(component: Tab2Component){
component.fun()
return window.confirm("确定离开?")
}
}
~~~
与之不同的是这次能清楚知道在哪个组件中离开,这个接口要实现一个泛型,这个泛型就是指定当前组件的类型
例子中为Tab2Component
canDeactivate()传入一个参数通过声明类型方式得到组件并可以使用组件中的方法fun()
~~~
export class Tab2Component implements OnInit {
constructor() { }
ngOnInit() {
}
fun(){
console.log("组件内方法")
}
}
~~~
打开app.module.ts;注入服务
~~~
providers: [CanActivateGuard,CanDeactivateGuard],
~~~
打开路由配置文件添加守卫
~~~
const routes: Routes = [
{
path:'',
redirectTo:'/index',
pathMatch:'full'
},
{
path: 'index',
component:Tab1Component
},
{
path: 'secound',
component:Tab2Component,
canActivate:[CanActivateGuard],
canDeactivate:[CanDeactivateGuard]
},
];
~~~
测试(进入路由点击首页)
![这里写图片描述](https://img-blog.csdn.net/20180814140044266?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTk1MjE5OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
控制台
![这里写图片描述](https://img-blog.csdn.net/2018081414013783?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTk1MjE5OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
点击确定(到达首页)
![这里写图片描述](https://img-blog.csdn.net/20180814140247273?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTk1MjE5OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
## 3、Resolve
进入路由前为路由提供数据
建立实现resolve接口的文件
~~~
import {ActivatedRouteSnapshot,Router,Resolve,RouterStateSnapshot} from '@angular/router';
import {Injectable} from '@angular/core';
import {Observable} from 'rxjs';
@Injectable()
export class RsolveDuard implements Resolve<any>{
constructor(private router:Router){
}
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): any | Observable<any> | Promise<any> {
let Id:number=route.params['id'];
if(Id==1){
return {id:123456,name:"这是名字"};
}else {
this.router.navigate(['/index']);
}
}
}
~~~
resolve()传入的两个参数route可以获取路由传入参数,state拥有一些路由的状态
同时在构造函数中注入Router,需要引入@Injectable()注入器才会有值
功能是传入参数为1返回一个数据,否则跳入首页
打开app.module.ts;注入服务
~~~
providers: [CanActivateGuard,CanDeactivateGuard,RsolveDuard],
~~~
打开路由配置文件添加守卫
~~~
const routes: Routes = [
{
path:'',
redirectTo:'/index',
pathMatch:'full'
},
{
path: 'index',
component:Tab1Component
},
{
path: 'secound/:id',
component:Tab2Component,
resolve:{
Data:RsolveDuard,
}
},
];
~~~
resolve属性后面的就是传入的数据,RsolveDuard即为返回的值
在组件中获取这个值
~~~
export class Tab2Component implements OnInit {
constructor(private routerInfo:ActivatedRoute) { }
public id;
public name;
ngOnInit() {
this.routerInfo.data.subscribe((val)=>{
this.id=val.Data.id;
this.name=val.Data.name;
});
}
}
~~~
跳转路由时传入的值一个为1一个为2
~~~
<a [routerLink]="['/index']">首页</a>
<a [routerLink]="['/secound',1]" >id=1</a>
<a [routerLink]="['/secound',2]" >id=2</a>
<router-outlet></router-outlet>
~~~
点击id=1把id和name展示在页面上
![这里写图片描述](https://img-blog.csdn.net/20180814153045458?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTk1MjE5OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
点击id=2跳回首页
![这里写图片描述](https://img-blog.csdn.net/20180814153227629?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTk1MjE5OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
- 目录结构
- 架构
- 指令
- 数据绑定
- 结构性指令
- 属性型指令
- 自定义指令
- 模板引用变量
- 属性绑定
- 事件绑定
- 组件
- 组件交互
- 管道
- 自定义管道
- 动态组件
- 变量检测机制
- 组件生命周期
- 路由
- 路由配置
- 路由导航
- 路由传值
- 父子路由
- 路由事件
- 顶级路由和特征路由
- 多重路由
- 路由守卫
- 路由守卫-简单理解
- 路由惰性加载
- 路由预加载
- 路由动画
- 网络请求
- GET请求
- POST请求
- JSOP请求
- 封装的http请求
- http拦截器
- 表单
- 响应式表单
- 驱动式表单
- CLI命令
- 启动应用
- 创建项目
- 创建组件
- 创建服务
- 创建路由守卫
- 创建特征模块
- 创建自定义指令
- 创建自定义管道
- 相关概念
- 急性加载
- 惰性加载
- 特征模块
- 常见问题
- 全局的Angular CLI大于本地的Angular CLI
- 包体优化