Angular-第8課-路由的基本觀念

Vincent Zheng
新手工程師的程式教室
6 min readDec 9, 2018

一個網站包含了許多網頁,而每個網頁有不同的網址。這一課要認識「路由」,學習如何定義URL與組件的對應關係,並利用超連結來顯示。

課程關鍵字:#路由(route) #routerLink

一、路由模組

為了能夠做到在各網頁之間遊走的效果,應用程式中會有一個模組,它扮演著類似「服務生」的角色。我們先向餐廳訂位,到餐廳後只要向服務生報上身份,他就會帶我們到座位上。而這個「路由模組」,則是定義好URL和網頁,一旦使用者前往這個URL,就會被導覽到對應的網頁。

首先執行下面的指令,建立一個路由模組。如果一開始建立應用程式專案時有選擇加入路由,可以略過這一步。

ng generate module 路由模組名稱 --flat --module=appng generate module app-routing --flat --module=app

打開/app/app-routing-module.ts,如果是透過指令建立的,內容應該長得像這樣子:

透過指令建立的預設路由模組

請把內容改成像下面這樣:

import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
const routes: Routes = [];@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule { }

「Routes」這個類別可用來定義URL與對應網頁的組合,就像客人與訂位桌號的關係。此處宣告了一個陣列,用來做為路由目的地的集合,讓Angular能夠像查表那樣來對照。這個在下一節會進行定義,屆時就能更了解了。

在@NgModule標記中的imports陣列,需要提供配置好的「路由器」。只要使用「RouterModule」模組的「forRoot」方法,就能得到一個初始化後的路由器。最後在exports陣列,導出RouterModule,讓路由模組的指令可以在組件被使用。

二、定義路由

在app-routing-module.ts中,宣告了一個routes陣列,它是用來存放URL與網頁的組合。如果要講得更精確,應該說「URL與組件」才對。在Angular,路由器會根據使用者前往的URL,來顯示對應的組件畫面。

若希望當網址是「localhost:4200/heroes」時,就顯示HeroesComponent組件,請像這樣子在routes陣列中添加一個物件:

{ path: '網址路徑', component: 組件 }{ path: 'heroes', component: HeroesComponent }

path屬性是從網站的「根路徑」開始算,而不是整串URL。至於component屬性則是該網址路徑所對應要顯示的組件。

這樣子就設定完成了。接下來請開啟app.component.html,將原本放置HeroesComponent的地方改成「<router-outlet></router-outlet>」。這是被路由到的組件所要顯示的位置。

儲存後瀏覽器會重新整理,在一開始的畫面,我們發現HeroesComponent和MessageComponent都不見了!原因是Heroes組件只有在使用者路由到正確的URL時才會被創建。如果手動在瀏覽器網址加上「/heroes」,先前的hero清單才會在「<router-outlet>」的位置顯示。

透過URL,路由到對應的組件

由於當初Heroes組件未被創建,連帶使得MessageService中沒有資料,導致Messages組件也沒出現。但它其實還是存在的,只是html檔的「ngIf」敘述,讓它在沒資料時不顯示裡面的內容罷了。這點可以透過把原先的<h2>標題文字移動到ngIf外面來確認。

三、超連結

網頁上會有許多「超連結」,可能是文字、按鈕或圖片等,點選它們能移動到另一個網頁。這一節要在應用程式的起始畫面加上超連結,這樣就不需要藉由輸入URL的方式來移動。

在HTML,超連結的語法是像這樣子:

<a href="要前往的網址">超連結文字</a><a href="https://www.google.com/">Google首頁</a>

但如果要透過Angular路由模組的幫助,做法就有一點點不同了。請開啟app.component.html,在<router-outlet>的上方加入一個超連結,文字顯示「Heroes」,並用「<nav>」標籤包起來:

<a routerLink="要前往的網址">超連結文字</a><nav>
<a routerLink="/heroes">Heroes</a>
</nav>

兩者的差別在於定義URL的屬性,Angular是使用「routerLink」,這是由第一節匯入的RouterModule模組所提供的屬性。而<nav>標籤是用來管理超連結的。

儲存後,畫面上會出現一個「Heroes」超連結,點擊後發現瀏覽器的網址跳轉了,Heroes組件也隨之出現。

加入超連結來進行路由

最後請在app.component組件套用新的CSS樣式,使畫面好看一些:

/* AppComponent's private CSS styles */
h1 {
font-size: 1.2em;
color: #999;
margin-bottom: 0;
}
h2 {
font-size: 2em;
margin-top: 0;
padding-top: 0;
}
nav a {
padding: 5px 10px;
text-decoration: none;
margin-top: 10px;
display: inline-block;
background-color: #eee;
border-radius: 4px;
}
nav a:visited, a:link {
color: #607d8b;
}
nav a:hover {
color: #039be5;
background-color: #cfd8dc;
}
nav a.active {
color: #039be5;
}

--

--

Vincent Zheng
新手工程師的程式教室

我是Vincent,是個來自資管系的後端軟體工程師。當初因為學校作業,才踏出寫部落格的第一步。這裡提供程式教學文章,包含自學和工作上用到的經驗,希望能讓讀者學到東西。我的部落已搬家至 https://chikuwa-tech-study.blogspot.com/