這一章主要會說明 Router Navigation Events 與 Router Lifecycle Hooks 之間的時序關係。從 Angular 應用程式中點擊一個連結,一步步解析 Router 的內部機制。
簡單來說,Events 是 Router 告訴你發生什麼,Hooks 是你告訴 Router 該做什麼。在接下來的流程解析中,你會看到這兩者如何在導航過程中密切配合,共同完成從點擊連結到頁面載入的完整旅程。
當使用者點擊了連結,在短短幾百毫秒內,Angular Router 會執行一系列精密的步驟:
在這張流程圖中:
當使用者點擊連結或呼叫 router.navigate()
時,導航生命週期正式開始。
<a routerLink="/profile">個人資料</a>
this.router.navigate(['/profile']);
NavigationStart 事件會立即發出,包含以下資訊:
id
:這次導航的唯一識別碼url
:目標 URLnavigationTrigger
:觸發原因(點擊、程式碼、瀏覽器前進/後退等)Router 分析 URL,找到對應的路由並處理重定向。當發出 RoutesRecognized 事件,表示 Router 已經:
Router 會依序執行不同類型的守衛,確保導航的安全性和正確性。
canDeactivate
檢查是否允許離開目前的頁面。
canLoad(僅限懶加載模組)
檢查是否允許載入新的功能模組。
canLoad
在 Angular 15+ 已被標記為 deprecatedcanMatch
替代canActivate / canActivateChild
檢查是否允許進入目標路由。
⚠️ 注意:canLoad 只在 懶加載模組 的情況下執行;非懶加載路由不會觸發。
通過守衛後,Router 執行 resolve()
以準備資料。
此時會依序觸發 ResolveStart
→ resolver → ResolveEnd
。
Resolver 的好處:
在 ActivationStart
與 ActivationEnd
之間,Angular 會:
若一切順利,發出 NavigationEnd
事件,表示導航完成。
若守衛回傳 false
或 UrlTree
,Router 會中止導航並發出 NavigationCancel。
若 resolver、守衛或其他流程拋出錯誤,則會發出 NavigationError。
當導航到相同的 URL 且 onSameUrlNavigation 設為 'ignore' 時,發出 NavigationSkipped(Angular 15+ 新增)。
理解 Angular Router 的完整生命週期能幫助你:
Angular Router 的導航生命週期是一個 安全、高效且可控 的流程。
透過理解與掌握它,你可以: