Angular路由守卫

情景:

    只有等用户已经登录并拥有某些权限时才能进入某些路由。

    一个由多个表单组件组成的导向,例如注册流程,用户只有在当前路由的组件中填写了满足要求的信息才可以导航到下一个路由。

    当用户未执行保存操作而试图离开当前导航时提醒用户。

分层路由介绍:

  CanActivate:处理导航到某路由的情况

  CanDeactivate:处理从当前路由离开的情况

  Resolve:在路由激活之前获得路由数据

 CanActivateChild:处理导航到某子路由的情况

        CanLoad:处理异步导航到某特性模块的情况   

CanActivate步骤:

1. 新增一个ts文件:

login.guard.ts:

import { CanActivate } from '@angular/router';

export class LonginGuard implements CanActivate {
  canActivate() {
    // tslint:disable-next-line:prefer-const
    let loggedIn: boolean = Math.random() < 0.5;
    if (!loggedIn) {
      console.log('用户未登录');
    }
    return loggedIn;
  }
}

2. 在路由中添加CanActivate:

app-routing.module.ts:

const routes: Routes = [{
    path: 'product/:id',
    component: ProductComponent,
    // 添加这一行
    canActivate: [LonginGuard],
 }]

@NgModule({
  // 添加这一行
  providers: [LonginGuard]
})

CanDeactivate步骤:

1. 新增一个ts文件:

unsaveed.guard.ts:

import { CanDeactivate } from '@angular/router';
import { ProductComponent } from '../product/product.component';

export class UnsavedGuard implements CanDeactivate<ProductComponent> {
  canDeactivate(component: ProductComponent) {
    return window.confirm('你还没保存确定要离开吗?');
  }
}

2. 在路由中添加CanDeactivate

app-routing.module.ts:

const routes: Routes = [
{
    path: 'product/:id',
    component: ProductComponent,
   // 添加这一行
    canDeactivate: [UnsavedGuard]
  }
];

@NgModule({
   // 添加这一行
  providers: [UnsavedGuard]
})
CanActivate 步骤:
const routes: Routes = [
{
    path: 'product/:id',
    component: ProductComponent,
   // 添加这一行
    canDeactivate: [UnsavedGuard]
  }
];

@NgModule({
   // 添加这一行
  providers: [UnsavedGuard]
})

Resolve步骤:

1. 新增一个ts文件:

product.resolve.ts:

import { Resolve, ActivatedRouteSnapshot, RouterStateSnapshot, Router } from '@angular/router';
import { Product } from '../product/product.component';
import { Observable } from 'rxjs';
import { Injectable } from '@angular/core';

@Injectable()
export class ProductResolve implements Resolve<Product> {

  constructor(private router: Router) {

  }

  resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<Product> | Promise<Product> | Product {
    const productId: number = route.params['id'];

    if (productId == 1) {
      return new Product(1, 'iPhone7');
    } else {
      this.router.navigate(['/home']);
      return undefined;
    }
  }
}
2. 在路由中添加 resolve:

app-routing.module.ts:

const routes: Routes = [
{
    path: 'product/:id',
    component: ProductComponent,
   // 添加这一行
    resolve: {
      product: ProductResolve
    }
  }
];

@NgModule({
   // 添加这一行
  providers: [ProductResolve]
})

3. 设置Product组件来获取数据

product.component.ts:

export class ProductComponent implements OnInit {

  private productId: number;

  private productName: String;

  constructor(private routeInfo: ActivatedRoute) { }

  ngOnInit() {   
this.routeInfo.params.subscribe((params: Params) => this.productId = params['id']);
    this.routeInfo.data.subscribe((data: { product: Product }) => {
      this.productId = data.product.id;
      this.productName = data.product.name;
    });
  }

}

export class Product {
  constructor(public id: number, public name: String) {
  }
}




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值