zoukankan      html  css  js  c++  java
  • [Angular2 Router] CanActivate Route Guard

    In this tutorial we are going to learn how we can to configure an can activate route guard in the Angular 2 router. We are going to implement the concrete example where a user can only enter a certain route if its authorized to do so. We are also going to give in this tutorial an example of how a route guard can also make asynchronous calls, by returning an observable that will eventually resolve to true or false.

    hero-can-activate.ts:

    import {CanActivate, RouterStateSnapshot, ActivatedRouteSnapshot} from "@angular/router";
    import {Observable, Subject} from "rxjs";
    import {StarWarsService} from "./heros.service";
    import {Injectable} from "@angular/core";
    @Injectable()
    export class CanHeroActivateDirective implements CanActivate{
    
      constructor(private sws: StarWarsService){
    
      }
    
      canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean>|boolean {
    
        if(this.sws.people){
          const sub = new Subject<boolean>();
          setTimeout( () => {
            const id = route.params['id'];
            const hero = this.sws.people.find( (p) => {
    
              return Number(p.id) === Number(id);
            });
            sub.next(hero.mass !== "unknown");
            sub.complete();
          });
    
          return sub;
        }else{
          return true;
        }
    
      }
    
    }

    heros.service.ts:

    import {Injectable, Inject} from '@angular/core';
    import {STARWARS_BASE_URL} from "../shared/constance.service";
    import {Http} from "@angular/http";
    import "rxjs/add/operator/map";
    import "rxjs/add/operator/switchMap";
    
    @Injectable()
    export class StarWarsService {
    
        people:any;
    
        constructor(@Inject(STARWARS_BASE_URL) private starwarUrl,
          private http: Http
        ) {}
    
        getPeople(){
          return this.http.get(`${this.starwarUrl}/people`)
            .map( res => res.json())
            .do( res => this.people = res)
        }
    
        getPersonDetail(id){
          return this.http.get(`${this.starwarUrl}/people/${id}`)
            .map( res => res.json())
            .map( (hero:any) => Object.assign({}, hero, {
              image: `${this.starwarUrl}/${hero.image}`
            }))
    
        }
    }

    heros.routes.ts:

    import {HerosComponent} from "./heros.component";
    import {RouterModule} from "@angular/router";
    import {HeroComponent} from "./hero/hero.component";
    import {CanHeroDeactivate} from "./heros-can-deactivate.directive";
    import {CanHeroActivateDirective} from "./heros-can-activate.directive";
    const routes = [
      {path: '', component: HerosComponent},
      {path: ':id', component: HeroComponent, canDeactivate: [CanHeroDeactivate], canActivate: [CanHeroActivateDirective]},
    ];
    export default RouterModule.forChild(routes)

    hero.module.ts:

    import { NgModule } from '@angular/core';
    import { CommonModule } from '@angular/common';
    import { HerosComponent } from './heros.component';
    import herosRoutes from './heros.routes';
    import {HeroComponent} from "./hero/hero.component";
    import {StarWarsService} from "./heros.service";
    import {RouterModule} from "@angular/router";
    import {CanHeroDeactivate} from "./heros-can-deactivate.directive";
    import {CanHeroActivateDirective} from "./heros-can-activate.directive";
    
    @NgModule({
      imports: [
        CommonModule,
        herosRoutes
      ],
      declarations: [HerosComponent, HeroComponent],
      providers: [StarWarsService, CanHeroDeactivate, CanHeroActivateDirective]
    })
    export default class HerosModule { }

    Github

  • 相关阅读:
    多校第五场 归并排序+暴力矩阵乘+模拟+java大数&amp;记忆化递归
    Cocos2dx-Android 之Makefile通用高级写法
    出现异常 child-&gt;m_pParent == 0
    mybatis一对多关联查询——(九)
    mybatis一对一关联查询——(八)
    mybatis关联查询数据模型分析——(七)
    mybatis动态sql——(六)
    mybatis输入输出映射——(五)
    SqlMapConfig.xml全局配置文件介绍——(四)
    mybatis开发dao的方法——(三)
  • 原文地址:https://www.cnblogs.com/Answer1215/p/5924763.html
Copyright © 2011-2022 走看看