Angular data 6

路由守衛(wèi)

使用場(chǎng)景

分三種方式

案例:
1德迹、CanActivate 路由守衛(wèi)用法
在app內(nèi)新增文件夾guard
新建login.guard.ts 模擬登陸狀態(tài);
調(diào)用CanActivate接口揭芍,return 的值為true視為登陸成功,可以下一步路由

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

/*實(shí)現(xiàn) CanActivate的接口*/
export class LoginGuard implements CanActivate{
  canActivate(){
    let loggedIn:boolean = Math.random() < 0.5;
    if(!loggedIn){
      console.log('用戶未登陸');
    }
    return loggedIn;

  }
}

路由配置app-routing.module.ts如下 :

....
 {path:'product/:id',component:ProductComponent,children:[
    {path:'',component:ProductDescComponent},
    {path:'seller/:id',component:SellerInfoComponent},
  ],canActivate:[LoginGuard] },

....

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule],
  /*依賴注入*/
  providers:[LoginGuard],
})
....

2卸例、canDeactivate路由守衛(wèi)用法
在當(dāng)前路由離開前称杨, 做相關(guān)守衛(wèi),如提供客戶還沒(méi)保存筷转,return值為true才通過(guò)姑原。
示例:新建unsaved.guard.ts文件

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

/*   <ProductComponent>  是泛型寫法 */

export class UnsavedGuard implements CanDeactivate<ProductComponent>{
  canDeactivate(component: ProductComponent){
    return window.confirm("還沒(méi)有保存");
  }
}

路由配置app-routing.module.ts如下 :

...
 {path:'product/:id',component:ProductComponent,children:[
    {path:'',component:ProductDescComponent},
    {path:'seller/:id',component:SellerInfoComponent},
  ],canActivate:[LoginGuard],
    canDeactivate:[UnsavedGuard]
  },
...
@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule],
  /*依賴注入*/
  providers:[LoginGuard,UnsavedGuard],
})

3、Resolve 守衛(wèi)呜舒,在路由激活前獲取數(shù)據(jù)給模塊渲染

3.1在guard中新建product.resolve.ts定義邏輯

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

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

  constructor(private router:Router){

  }

  resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot){
    let productId:number = route.params['id'];
    if(productId == 1){
      return new Product(1,'iPhone7');
    }else{
      this.router.navigate(['/home']);
      return undefined;
    }

  }

}

3.2 在product組件中定義Product對(duì)象

import { Component, OnInit } from '@angular/core';
import {ActivatedRoute, Params} from "@angular/router";

@Component({
  selector: 'app-product',
  templateUrl: './product.component.html',
  styleUrls: ['./product.component.css']
})
export class ProductComponent implements OnInit {

  private productId:number;//定義接收的ID變量
  private productName:string;//定義接收的productName變量
  constructor(private routeInfo:ActivatedRoute) { }

  ngOnInit() {
    /* 通過(guò)參數(shù)訂閱取得數(shù)據(jù) */
    this.routeInfo.params.subscribe((param:Params)=>this.productId = param['id']);
    this.routeInfo.data.subscribe((data:{product:Product})=>{
      this.productId = data.product.id;
      this.productName = data.product.name;
    })
    /*通過(guò) queryParams 方法取得參數(shù)快照*/
    // this.productId = this.routeInfo.snapshot.params['id'];
  }

}

3.3在product組件模板中定義輸出變量

<div class="product">
  <p>
    這是一個(gè)商品組件
  </p>

  <p>
    查詢參數(shù)傳遞過(guò)來(lái)的組件ID:{{productId}}
  </p>
 <p>
    商品名稱是:{{productName}}
  </p>

  <br>

  <hr>

  <a [routerLink]="['./']">商品的描述</a>
  <a [routerLink]="['./seller',99]">銷售員信息</a>

  <router-outlet></router-outlet>
</div>

3.4 在app-routing.module.ts中定義調(diào)用

import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import {HomeComponent} from "./home/home.component";
import {ProductComponent} from "./product/product.component";
import {Code404Component} from "./code404/code404.component";
import {ProductDescComponent} from "./product-desc/product-desc.component";
import {SellerInfoComponent} from "./seller-info/seller-info.component";
import {ChatComponent} from "./chat/chat.component";
import {LoginGuard} from "./guard/login.guard";
import {UnsavedGuard} from "./guard/unsaved.guard";
import {ProductResolve} from "./guard/product.resolve";

const routes: Routes = [
  {path:'',redirectTo:'/home',pathMatch:'full'},
  {path:'chat',component:ChatComponent,outlet:'aux'},
  {path:'home',component:HomeComponent},
  {path:'product/:id',component:ProductComponent,children:[
    {path:'',component:ProductDescComponent},
    {path:'seller/:id',component:SellerInfoComponent},
  ],resolve:{
    product:ProductResolve
  }
  },

  /* 路由配 通配符路由通常放最后面 */
  {path:'**',component:Code404Component},
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule],
  /*依賴注入*/
  providers:[LoginGuard,UnsavedGuard,ProductResolve],
})
export class AppRoutingModule { }

路由部分源碼:
鏈接: https://pan.baidu.com/s/1bBZYJs 密碼: ukwe

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末锭汛,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子袭蝗,更是在濱河造成了極大的恐慌唤殴,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件到腥,死亡現(xiàn)場(chǎng)離奇詭異朵逝,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)乡范,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門配名,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)啤咽,“玉大人,你說(shuō)我怎么就攤上這事渠脉∮钫” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵芋膘,是天一觀的道長(zhǎng)鳞青。 經(jīng)常有香客問(wèn)我,道長(zhǎng)索赏,這世上最難降的妖魔是什么盼玄? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮潜腻,結(jié)果婚禮上埃儿,老公的妹妹穿的比我還像新娘。我一直安慰自己融涣,他們只是感情好童番,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著威鹿,像睡著了一般剃斧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上忽你,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天幼东,我揣著相機(jī)與錄音,去河邊找鬼科雳。 笑死根蟹,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的糟秘。 我是一名探鬼主播简逮,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼尿赚!你這毒婦竟也來(lái)了散庶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤凌净,失蹤者是張志新(化名)和其女友劉穎悲龟,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體泻蚊,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡躲舌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了性雄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片没卸。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡羹奉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出约计,到底是詐尸還是另有隱情诀拭,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布煤蚌,位于F島的核電站耕挨,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏尉桩。R本人自食惡果不足惜筒占,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蜘犁。 院中可真熱鬧翰苫,春花似錦、人聲如沸这橙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)屈扎。三九已至埃唯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鹰晨,已是汗流浹背墨叛。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留模蜡,地道東北人巍实。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像哩牍,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子令漂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容