下面的部分重點介紹了一些路由器的核心概念。
Angular 的 Router
是一個可選服務(wù),它為指定的 URL
提供特定的組件視圖。它不是 Angular 核心的一部分,因此它位于自己的包 @angular/router
中。
從任何其它的 Angular 包中導(dǎo)入你需要的東西。
Path:"src/app/app.module.ts (import)" 。
import { RouterModule, Routes } from '@angular/router';
有關(guān)瀏覽器 URL 風(fēng)格的更多信息,請參閱 LocationStrategy 和瀏覽器的網(wǎng)址樣式。
帶路由的 Angular 應(yīng)用中有一個 Router
服務(wù)的單例實例。當(dāng)瀏覽器的 URL
發(fā)生變化時,該路由器會查找相應(yīng)的 Route
,以便根據(jù)它確定要顯示的組件。
在配置之前,路由器沒有任何路由。下面的例子創(chuàng)建了五個路由定義,通過 RouterModule.forRoot()
方法配置路由器,并把結(jié)果添加到 AppModule
的 imports
數(shù)組中。
Path:"src/app/app.module.ts (excerpt)" 。
const appRoutes: Routes = [
{ path: 'crisis-center', component: CrisisListComponent },
{ path: 'hero/:id', component: HeroDetailComponent },
{
path: 'heroes',
component: HeroListComponent,
data: { title: 'Heroes List' }
},
{ path: '',
redirectTo: '/heroes',
pathMatch: 'full'
},
{ path: '**', component: PageNotFoundComponent }
];
@NgModule({
imports: [
RouterModule.forRoot(
appRoutes,
{ enableTracing: true } // <-- debugging purposes only
)
// other imports here
],
...
})
export class AppModule { }
appRoutes
路由數(shù)組描述了如何導(dǎo)航。把它傳給模塊的 imports
數(shù)組中的 RouterModule.forRoot()
方法來配置路由器。
每個 Route
都會把一個 URL path
映射到一個組件。路徑中沒有前導(dǎo)斜杠。路由器會為你解析并構(gòu)建最終的 URL
,這樣你就可以在應(yīng)用視圖中導(dǎo)航時使用相對路徑和絕對路徑了。
第二個路由中的 :id
是路由參數(shù)的令牌。在像 "/hero/42" 這樣的 URL
中,“42”是 id
參數(shù)的值。相應(yīng)的 HeroDetailComponent
用這個值來查找并顯示 id
為 42 的英雄。
第三個路由中的 data
屬性是存放與該特定路由關(guān)聯(lián)的任意數(shù)據(jù)的地方。每個激活的路由都可以訪問 data
屬性??梢杂盟鼇泶鎯撁鏄?biāo)題,面包屑文本和其它只讀靜態(tài)數(shù)據(jù)等項目。你可以嘗試使用解析器守衛(wèi)來檢索動態(tài)數(shù)據(jù)。
第四個路由中的空路徑表示該應(yīng)用的默認(rèn)路徑 - 當(dāng) URL 中的路徑為空時通常要去的地方,就像它在剛進來時一樣。這個默認(rèn)路由重定向到了 "/heroes" 這個 URL
的路由,因此會顯示 HeroesListComponent
。
如果你需要查看導(dǎo)航生命周期中發(fā)生了什么事件,可以把 enableTracing
選項作為路由器默認(rèn)配置的一部分。這會把每個導(dǎo)航生命周期中發(fā)生的每個路由器事件都輸出到瀏覽器控制臺中。enableTracing
只會用于調(diào)試目的。你可以把 enableTracing: true
選項作為第二個參數(shù)傳給 RouterModule.forRoot()
方法。
RouterOutlet
是一個來自路由器庫的指令,雖然它的用法像組件一樣。它充當(dāng)占位符,用于在模板中標(biāo)記出路由器應(yīng)該顯示把該組件顯示在那個出口的位置。
<router-outlet></router-outlet>
<!-- Routed components go here -->
對于上面的配置,當(dāng)這個應(yīng)用的瀏覽器 URL 變?yōu)?"/heroes" 時,路由器就會把這個 URL 與路由路徑 "/heroes" 匹配,并把 HeroListComponent
作為兄弟元素顯示在宿主組件模板中的 RouterOutlet
下方。
要想通過某些用戶操作(比如單擊一下 a 標(biāo)簽)進行導(dǎo)航,請使用 RouterLink
。
考慮下面的模板:
Path:"src/app/app.component.html " 。
<h1>Angular Router</h1>
<nav>
<a routerLink="/crisis-center" routerLinkActive="active">Crisis Center</a>
<a routerLink="/heroes" routerLinkActive="active">Heroes</a>
</nav>
<router-outlet></router-outlet>
a
標(biāo)簽上的 RouterLink
指令讓路由器可以控制這些元素。導(dǎo)航路徑是固定的,所以你可以給 routerLink
賦值一個字符串(“一次性”綁定)。
如果導(dǎo)航路徑更加動態(tài),你可以給它綁定到一個模板表達(dá)式,該表達(dá)式要返回一個鏈接參數(shù)數(shù)組。路由器會把該數(shù)組解析成一個完整的 URL
。
RouterLinkActive
指令會根據(jù)當(dāng)前的 RouterState
切換活動 RouterLink
上所綁定的 CSS 類。
在每個 a
標(biāo)簽上,你會看到一個到 RouterLinkActive
指令的屬性綁定,就像 routerLinkActive
="..."。
等號 =
右側(cè)的模板表達(dá)式,包含一個以空格分隔的 CSS 類字符串,當(dāng)這個鏈接處于活動狀態(tài)時,路由器就會加上這些字符串(并在非活動狀態(tài)時刪除)。你可以把 RouterLinkActive
指令設(shè)置成一串類的字符串,比如 [routerLinkActive]="'active fluffy'",也可以把它綁定到一個返回這樣一個字符串的組件屬性上。
活動路由鏈接會級聯(lián)到路由樹的每個級別,這樣父路由和子路由鏈接就可以同時處于活動狀態(tài)。要覆蓋這種行為,你可以用 { exact: true }
表達(dá)式綁定到 [routerLinkActiveOptions]
輸入綁定。使用 { exact: true }
之后,給定的 RouterLink
只有在 URL
與當(dāng)前 URL
完全匹配時才會激活。
每個成功的導(dǎo)航生命周期結(jié)束后,路由器都會構(gòu)建一個 ActivatedRoute
對象樹,它構(gòu)成了路由器的當(dāng)前狀態(tài)。你可以從任何地方使用應(yīng)用的 Router
服務(wù)和 routerState
屬性來訪問當(dāng)前的 RouterState
。
RouterState
中的每個 ActivatedRoute
都提供了向上或向下遍歷路由樹的方法,用于從父路由、子路由和兄弟路由中獲取信息。
路由的路徑和參數(shù)可以通過注入名為 ActivatedRoute
的路由服務(wù)獲得。它提供了大量有用的信息,包括:
屬性 | 說明 |
---|---|
url | 一個路由路徑的 Observable ,是一個由路由路徑的各個部分組成的字符串?dāng)?shù)組。 |
data | 包含提供給當(dāng)前路由的 data 對象的 Observable 。 也包含任何由解析守衛(wèi)解析出的值。 |
paramMap | 一個包含該路由的必要參數(shù)和可選參數(shù) map 的 Observable 。 這個 map 支持從同一個參數(shù)中獲得單個或多個值。 |
queryParamMap | 一個包含適用于所有路由的查詢參數(shù) map 的 Observable 。 這個 map 支持從同一個查詢參數(shù)中獲得單個或多個值。 |
fragment | 一個適用于所有路由的 URL 片段的 Observable 。 |
outlet | 用來渲染該路由的 RouterOutlet 的名字。 對于無名出口,這個出口的名字是 primary 。 |
routeConfig | 包含原始路徑的那個路由的配置信息。 |
parent | 當(dāng)該路由是子路由時,表示該路由的父級 ActivatedRoute 。 |
firstChild | 包含該路由的子路由列表中的第一個 ActivatedRoute 。 |
children | 包含當(dāng)前路由下所有激活的子路由。 |
還有兩個較舊的屬性,但更推薦使用它們的替代品,因為它們可能會在以后的 Angular 版本中棄用。
- `params` :一個 `Observable`,它包含專屬于該路由的必要參數(shù)和可選參數(shù)。請改用 `paramMap`。
- `queryParams`:一個包含可用于所有路由的查詢參數(shù)的 `Observable`。請改用 `queryParamMap`。
Router
在每次導(dǎo)航過程中都會通過 Router.events
屬性發(fā)出導(dǎo)航事件。這些事件的范圍貫穿從導(dǎo)航開始和結(jié)束之間的多個時間點。導(dǎo)航事件的完整列表如下表所示。
路由事件 | 說明 |
---|---|
NavigationStart | 導(dǎo)航開始時觸發(fā)的事件。 |
RouteConfigLoadStart | 在 Router 惰性加載路由配置之前觸發(fā)的事件。 |
RouteConfigLoadEnd | 在某個路由已經(jīng)惰性加載完畢時觸發(fā)的事件。 |
RoutesRecognized | 當(dāng)路由器解析了 URL,而且路由已經(jīng)識別完畢時觸發(fā)的事件。 |
GuardsCheckStart | 當(dāng)路由器開始進入路由守衛(wèi)階段時觸發(fā)的事件。 |
ChildActivationStart | 當(dāng)路由器開始激活某路由的子路由時觸發(fā)的事件。 |
ActivationStart | 當(dāng)路由器開始激活某個路由時觸發(fā)的事件。 |
GuardsCheckEnd | 當(dāng)路由器成功結(jié)束了路由守衛(wèi)階段時觸發(fā)的事件。 |
ResolveStart | 當(dāng)路由器開始路由解析階段時觸發(fā)的事件。 |
ChildActivationEnd | 當(dāng)路由器成功激活某路由的子路由時觸發(fā)的事件。 |
ResolveEnd | 當(dāng)路由器的路由解析階段成功完成時觸發(fā)的事件。 |
ActivationEnd | 當(dāng)路由器成功激活了某個路由時觸發(fā)的事件。 |
NavigationEnd | 當(dāng)導(dǎo)航成功結(jié)束時觸發(fā)的事件。 |
NavigationCancel | 當(dāng)導(dǎo)航被取消時觸發(fā)的事件。 這可能在導(dǎo)航期間某個路由守衛(wèi)返回了 false 或返回了 UrlTree 以進行重定向時發(fā)生。 |
NavigationError | 當(dāng)導(dǎo)航由于非預(yù)期的錯誤而失敗時觸發(fā)的事件。 |
Scroll | 用來表示滾動的事件。 |
當(dāng)啟用了 enableTracing
選項時,Angular 會把這些事件都記錄到控制臺。有關(guān)篩選路由器導(dǎo)航事件的示例,請參閱 Angular 中的 Observables
一章的路由器部分。
這里是一些關(guān)鍵的 Router
術(shù)語及其含義:
路由器部件 | 含義 |
---|---|
Router | 為活動 URL 顯示應(yīng)用中的組件。 管理從一個組件到另一個的導(dǎo)航。 |
RouterModule | 一個單獨的 NgModule ,它提供了一些必要的服務(wù)提供者和一些用于在應(yīng)用視圖間導(dǎo)航的指令。 |
Routes | 定義一個路由數(shù)組,每一個條目都會把一個 URL 路徑映射到組件。 |
Route | 定義路由器如何基于一個 URL 模式導(dǎo)航到某個組件。 大部分路由都由一個路徑和一個組件類組成。 |
RouterOutlet | 該指令 (<router-outlet> ) 用于指出路由器應(yīng)該把視圖顯示在哪里。 |
RouterLink | 用于將可點擊的 HTML 元素綁定到某個路由的指令。單擊帶有 routerLink 指令且綁定到字符串或鏈接參數(shù)數(shù)組的元素,將觸發(fā)導(dǎo)航。 |
RouterLinkActive | 該指令會在元素上或元素內(nèi)包含的相關(guān) routerLink 處于活動/非活動狀態(tài)時,從 HTML 元素上添加/移除類。 |
ActivatedRoute | 一個提供給每個路由組件的服務(wù),其中包含當(dāng)前路由專屬的信息,例如路由參數(shù)、靜態(tài)數(shù)據(jù)、解析數(shù)據(jù)、全局查詢參數(shù)和全局片段。 |
RouterState | 路由器的當(dāng)前狀態(tài),包括一棵當(dāng)前激活路由的樹以及遍歷這棵路由樹的便捷方法。 |
鏈接參數(shù)數(shù)組 | 一個由路由器將其解釋為路由指南的數(shù)組。你可以將該數(shù)組綁定到 RouterLink 或?qū)⒃摂?shù)組作為參數(shù)傳遞給 Router.navigate 方法。 |
路由組件 | 一個帶有 RouterOutlet 的 Angular 組件,可基于路由器的導(dǎo)航來顯示視圖。 |
更多建議: