最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Angular2學習筆記——詳解路由器模型(Router)

 更新時間:2016年12月02日 17:07:24   作者:木的樹  
這篇文章主要介紹了Angular2學習筆記——詳解路由器模型(Router),非常具有實用價值,需要的朋友可以參考下。

Angular2以組件化的視角來看待web應用,使用Angular2開發(fā)的web應用,就是一棵組件樹。組件大致分為兩類:一類是如list、table這種通放之四海而皆準的通用組件,一類是專為業(yè)務開發(fā)的業(yè)務組件。實際開發(fā)中大部分時間我們都需要處理業(yè)務組件。對于SPA應用來說,一個通用的問題就是如何控制頁面的切換,解決這個問題的通用方法就是利用路由器來實現(xiàn)。

路由配置

現(xiàn)在我們先撇開Angular2來看看通用的路由器模型。通常來講SPA應用需要路由配置信息:

[
 { path: '', pathMatch: 'full', redirectTo: '/inbox' },
 {
  path: ':folder',
  children: [
   {
    path: '',
    component: ConversationsCmp
   },
   {
    path: ':id',
    component: ConversationCmp,
    children: [
     { path: 'messages', component: MessagesCmp },
     { path: 'messages/:id', component: MessageCmp }
    ]
   }
  ]
 },
 {
  path: 'compose',
  component: ComposeCmp,
  outlet: 'popup'
 },
 {
  path: 'message/:id',
  component: PopupMessageCmp,
  outlet: 'popup'
 }
]

這個配置信息定義了應用的潛在路由狀態(tài)(Router State)。一個路由狀態(tài)代表了一份組件布置信息。 現(xiàn)在我們換一個視角來看這份配置:

在這棵配置樹中,每一個節(jié)點就是一個路由,它對應了一個組件。

路由狀態(tài)

在路由樹這種視角下,每一個路由狀態(tài)就是配置樹的一棵子樹。下圖中的路由狀態(tài)下,最終被激活的組件是ConversationCmp:

導航

路由器的首要任務就是控制在不同路由狀態(tài)之間導航以及更新組件樹。如下圖所示,當我們導航到另一個頁面時,路由狀態(tài)也會發(fā)生改變,隨之頁面上顯示的組件也跟隨變化。

到此為止路由器的基本模型已經(jīng)介紹完畢,下面我們來看一下Angular2中的路由模型。

Angular2路由處理流程

Angular2對待一個URL的處理流程為:

1.應用重定向

2.識別路由狀態(tài)

3.應用哨兵與傳遞數(shù)據(jù)

4.激活對應組件

重定向

假設我們訪問的地址是:http://hostname/inbox/33/message/44。路由器首先根據(jù)配置規(guī)則:

{ path: ‘', pathMatch: ‘full', redirectTo: ‘/inbox' }

來判斷是否需要重定向,如果我們的url是http://hostname/此時,就是重定向到http://hostname/inbox,根據(jù)配置規(guī)則:folder,這時候被激活的組件就是ConversationComp。但現(xiàn)在我們的url是http://hostname/inbox/33/message/44,所以不會發(fā)生重定向。

識別路由狀態(tài)

接下來路由器會為這個URL分發(fā)一個路由狀態(tài)。根據(jù)配置規(guī)則

{
  path: ':folder',
  children: [
   {
    path: '',
    component: ConversationsCmp
   },
   {
    path: ':id',
    component: ConversationCmp,
    children: [
     { path: 'messages', component: MessagesCmp },
     { path: 'messages/:id', component: MessageCmp }
    ]
   }
  ]
 }

/inbox/33/message/44首先匹配:folder,對應組件為ConversationCmp,而后進入子配置,'message/:id',MessageCmp組件被激活。

根據(jù)上圖的狀態(tài)樹,我們可以看出MessageCmp與ConversationCmp對應的路由狀態(tài)。與此同時一個被稱為激活路由(ActivatedRoute)的對象將被創(chuàng)建,并可以在MessageCmp訪問到,通過ActivatedRoute我們可以拿到它的routerState屬性,通過路由狀態(tài)我們可以拿到具體參數(shù)如id對應的44。從此也可以看出拿到父級參數(shù)id(33)就必須訪問父級的路由狀態(tài)。

  ngOnInit() {
    this.sub = this.router.routerState.parent(this.route).params.subscribe(params => {
      this.parentRouteId = +params["id"];
    });
  }

哨兵與分發(fā)數(shù)據(jù)

哨兵的作用是判斷是否允許應用在不同狀態(tài)間進行切換,比如:如果用戶沒有登陸就不允許進入Message頁面。哨兵可以用來判斷是否允許進入本路由狀態(tài),是否允許離開本路由狀態(tài)。下例中的CanActivate用來判斷是否允許進入,這個服務類需要繼承CanActivate接口。

 import { AuthGuard }        from '../auth-guard.service';

const adminRoutes: Routes = [
 {
  path: 'admin',
  component: AdminComponent,
  canActivate: [AuthGuard],
  children: [
   {
    path: '',
    children: [
     { path: 'crises', component: ManageCrisesComponent },
     { path: 'heroes', component: ManageHeroesComponent },
     { path: '', component: AdminDashboardComponent }
    ],
   }
  ]
 }
];

export const adminRouting: ModuleWithProviders = RouterModule.forChild(adminRoutes);
import { Injectable }   from '@angular/core';
import { CanActivate }  from '@angular/router';

@Injectable()
export class AuthGuard implements CanActivate {
 canActivate() {
  console.log('AuthGuard#canActivate called');
  return true;
 }
}

哨兵內(nèi)容涉及到另一個部分知識,所以我會把他放到下一篇文章中。

Angular2的路由器允許我們在進入組件中拿到除當前路由參數(shù)之外的其他信息。在路由配置中使用resolve屬性指定一個數(shù)據(jù)分發(fā)器。

[
 {
  path: ':folder',
  children: [
   {
    path: '',
    component: ConversationsCmp,
    resolve: {
     conversations: ConversationsResolver
    }
   }
  ]
 }
]

數(shù)據(jù)分發(fā)器需要繼承DataResolver接口:

@Injectable()
class ConversationsResolver implements DataResolver {
 constructor(private repo: ConversationsRepo, private currentUser: User) {}

 resolve(route: ActivatedRouteSnapshot, state: RouteStateSnapshot):
   Promise<Conversation[]> {
  return this.repo.fetchAll(route.params['folder'], this.currentUser);
 }
}

還需要把這個數(shù)據(jù)分發(fā)器加入到module的Providers中:

@NgModule({
 //...
 providers: [ConversationsResolver],
 bootstrap: [MailAppCmp]
})
class MailModule {
}

platformBrowserDynamic().bootstrapModule(MailModule);

而后我們在組件中就可以通過ActivatedRoute來訪問分發(fā)數(shù)據(jù)了。

@Component({
 template: `
  <conversation *ngFor="let c of conversations | async"></conversation>
 `
})
class ConversationsCmp {
 conversations: Observable<Conversation[]>;
 constructor(route: ActivatedRoute) {
  this.conversations = route.data.pluck('conversations');
 }
}

激活組件

此時路由器根據(jù)路由狀態(tài)來實例化組件并把他們放到合適的路由組出發(fā)點上。

@Component({
 template: `
  ...
  <router-outlet></router-outlet>
  ...
  <router-outlet name="popup"></router-outlet>
 `
})
class MailAppCmp {
}

如‘/inbox/33/message/44(popup:compose)',首先實例化ConversationCmp放到主<router-outlet>中,然后實例化MessageCmp放到name為popup的<Router-outlet>中。

現(xiàn)在路由器對URL的解析過程完畢。但是如果用戶想從MessageCmp中跳轉到別的路由狀態(tài)該如何做呢?Angular2提供了兩種方式。

一種是通過router.navigate方法來導航:

@Component({...})
class MessageCmp {
 private id: string;
 constructor(private route: ActivatedRoute, private router: Router) {
  route.params.subscribe(_ => this.id = _.id);
 }

 openPopup(e) {
  this.router.navigate([{outlets: {popup: ['message', this.id]}}]).then(_ => {
   // navigation is done
  });
 }
}

一種是利用router-link方式:

@Component({
 template: `
  <a [routerLink]="['/', {outlets: {popup: ['message', this.id]}}]">Edit</a>
 `
})
class MessageCmp {
 private id: string;
 constructor(private route: ActivatedRoute) {
  route.params.subscribe(_ => this.id = _.id);
 }
}

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

  • Angular 2父子組件之間共享服務通信的實現(xiàn)

    Angular 2父子組件之間共享服務通信的實現(xiàn)

    這篇文章主要給大家介紹了關于Angular 2父子組件之間共享服務通信的相關資料,文中通過示例代碼介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面來一起看看吧。
    2017-07-07
  • 使用AngularJS實現(xiàn)可伸縮的頁面切換的方法

    使用AngularJS實現(xiàn)可伸縮的頁面切換的方法

    這篇文章主要介紹了使用AngularJS實現(xiàn)可伸縮的頁面切換的方法,AngularJS是一款熱門的JavaScript庫,需要的朋友可以參考下
    2015-06-06
  • AngularJS 依賴注入詳解和簡單實例

    AngularJS 依賴注入詳解和簡單實例

    本文主要介紹AngularJS 依賴注入,這里對依賴注入做了詳細介紹講解,并提供效果圖和示例代碼以便學習參考
    2016-07-07
  • AngularJS中的作用域實例分析

    AngularJS中的作用域實例分析

    這篇文章主要介紹了AngularJS中的作用域,結合實例形式較為詳細的分析了AngularJS涉及作用域的相關問題與注意事項,需要的朋友可以參考下
    2018-05-05
  • Angular使用Md5加密的解決方法

    Angular使用Md5加密的解決方法

    這篇文章主要介紹了Angular使用Md5加密的解決方法,需要的朋友可以參考下
    2017-09-09
  • AngularJs directive詳解及示例代碼

    AngularJs directive詳解及示例代碼

    本文主要講解AngularJs directive的知識,這里整理了相關資料及示例代碼,有興趣的小伙伴可以參考下
    2016-09-09
  • angular json對象push到數(shù)組中的方法

    angular json對象push到數(shù)組中的方法

    下面小編就為大家分享一篇angular json對象push到數(shù)組中的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-02-02
  • Angular整合zTree的示例代碼

    Angular整合zTree的示例代碼

    本篇文章主要介紹了Angular整合zTree的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • 最新評論

    尚志市| 三穗县| 景德镇市| 阿巴嘎旗| 崇左市| 家居| 阳新县| 梁平县| 新宁县| 土默特左旗| 怀远县| 舒兰市| 微博| 凉城县| 康定县| 治县。| 威远县| 东辽县| 类乌齐县| 中西区| 英山县| 布拖县| 綦江县| 九龙县| 陈巴尔虎旗| 沧州市| 卢湾区| 额尔古纳市| 瓦房店市| 炉霍县| 佛坪县| 陇川县| 镇江市| 乳山市| 永和县| 河津市| 大埔区| 高清| 曲麻莱县| 偏关县| 洛南县|