Router
Angular 路由
建立 component 之後,去 /src/app/app-routing.module.ts
引進 component
1 | import { BrowserModule } from "@angular/platform-browser"; |
在去 /src/app/app-routing-modules.ts
加上 routers
1 | import { NgModule } from "@angular/core"; |
1 | const routes: Routes = [ |
轉址
HTML5 URLs and the <base href>
The guidelines that follow will refer to different parts of a URL. This diagram outlines what those parts refer to:
1 | foo://example.com:8042/over/there?name=ferret#nose |
template 寫法
1 | <a [routerLink]="['products']" [queryParams]="{ id: 101 }">Prodcuts</a> |
用 function 轉跳網址
1 | import { Router } from "@angular/router"; |
1 | const routes: Routes = [ { path: 'group/:id/:categories', ... }]; |
1 | // /market/categories/group/516/led-light |
Angular Router 教學 - Wayne’s Talk
[功能介紹-15] Router 進階介紹 - iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天
[Angular 深入淺出三十天] Day 25 - 路由總結(一) - iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天
取得參數
1 | export class ProductsComponent implements OnInit { |
延遲 Lazy Page
在網站一開始進來的時候,不把所有網站用到的資原全部載入,由 router 對應到的 module 各別載入
Create a feature module with routing
Next, you’ll need a feature module with a component to route to. To make one, enter the following command in the terminal, where customers
is the name of the feature module. The path for loading the customers
feature modules is also customers
because it is specified with the --route
option:
1 | ng generate module customers --route customers --module app.module |
This creates a customers
folder having the new lazy-loadable feature module CustomersModule
defined in the customers.module.ts
file and the routing module CustomersRoutingModule
defined in the customers-routing.module.ts
file. The command automatically declares the CustomersComponent
and imports CustomersRoutingModule
inside the new feature module.
Because the new module is meant to be lazy-loaded, the command does NOT add a reference to the new feature module in the application’s root module file, app.module.ts
. Instead, it adds the declared route, customers
to the routes
array declared in the module provided as the --module
option.
1 | const routes: Routes = [ |
路由守衛
解決了什麼問題?
在 angular 中,路由守衛主要可以解決以下的問題
- 對於用戶訪問頁面的權限能否進入(是否已經登錄?已經登錄的角色是否有權限?)
- 在跳轉到組件之前獲取必須的數據 頁面時,提示用戶是否保存未提交的修改
- 離開頁面時,提示用戶是否保存未提交的修改
Angular 幾個路由模塊提供瞭如下的接口用於幫助我們解決上面的問題
- CanActivate 操作訪問處理系統跳轉到可以執行的地址:(判斷是否)
- CanActivateChild 功能同 CanActivate,加點菜
- CanDeactivate:使用處理從當前路由的情況(判斷是否存在未提交的信息)
- CanLoad 延遲加載的方式: 是否允許通過
在經過了路由守衛,通過添加路由守衛返回的值,從而達到路由控制的最終目的
- true:導航繼續
- false:導航欄,用戶跳轉停留在當前的頁面或者是到指定的頁面
- UrlTree:取消當前的導航,並導航到路由守衛返回的這個 UrlTree 上(一個新的路由信息)
建立一個 guard
透過 agnular CLI
建立一個 guard
來實現路由守衛,
1 | ng g guard auth/auth |
在 router 建立一個路由守衛
1 | const routes: Routes = [ |
matcher
1 | export const UserRoutes: Routes = [ |
directive router
RouterLink
RouterLinkActive
routerLinkActive 則是用來設定若現在的網址與所設定的連結一致時,要加上去的 Class 名稱,也可以利用來判斷顯示的邏輯
1 | <a |
RouterLinkWithHref
RouterOutlet
你可能會遇到的問題
*如果你重複使用 component 的話
觸發 events 的 subscribe 會經過很多的 event
Angular 框架中去监听路由的改变(Router 中的 events: Observable )
1 | this.router.events.subscribe((ev) => { |
在 parent 要拿到本頁的 component
情境說明,在 header 因為要透過頁面 router 的 data 來判斷資料顯示。但在此處的 route 是直向最外面的 app.component
,但真正想要拿到的東西是在 firstChild 裡面,所以透過 while
來取得最後一個 component
1 | let current = this.route.firstChild; |
[ 注意 ] 如果是 lazy page 的話,中間會有一層
component
為 undefine