1. すぐに始めましょう
- ルーティングはモジュールに基づいており、各モジュールは独自のルートを持つことができます。各ルートはコンポーネントに対応します。
- モジュールでは、ルーティング機能を提供する
RouterModule
モジュールを導入する必要があります。RouterModule
そして、表示する必要があるコンポーネントを導入して宣言する必要があります
...
import {
RouterModule} from "@angular/router";
import {
HomeComponent } from './pages/home/home.component';
import {
AboutComponent } from './pages/about/about.component';
@NgModule({
// 声明当前模块拥有哪些组件
declarations: [
AppComponent, // 根组件
HomeComponent,
AboutComponent,
],
...
})
- ルーティング ルールを定義し、現在のモジュールがルーティング モジュールに依存していることを宣言します。同時に、ルーティング ルールをルーティング モジュールに渡す必要があります。
RouterModule.forRoot
このメソッドは、ルートを定義するために使用されます。このメソッドにより、アプリケーションは 1 つのみをインスタンス化します。RouterModule
最初のパラメータはオブジェクト配列です。オブジェクトは通常、path
アドレス バーのパスと、component
パスに従って動的にロードされるコンポーネントを表す 2 つの属性で構成されます; 2 番目のパラメータは Configuration オブジェクトで、ルーティングの代わりにルーティングをuseHash:true
使用することを示します。hash
history
...
// path开头不需要加斜线
const routes = [
{
path: 'home', component: HomeComponent},
{
path: 'about', component: AboutComponent},
];
...
@NgModule({
...
imports: [BrowserModule, RouterModule.forRoot(routes, {
useHash: true})],
...
})
- モジュールのルート コンポーネントでルーティング ジャンプ リンク (スラッシュを追加する必要があります) とルーティング ソケット (プレースホルダー) を定義します。
routerLink
Angular
は、定義したルートをテンプレート ファイルに接続する組み込みディレクティブです。
<a routerLink="/home">首页</a> |
<a routerLink="/about">关于</a>
<router-outlet></router-outlet>
- これら 2 つの
a
リンクをクリックすると、url
アドレスによって表示されるコンテンツとルーティング ソケットの場所がそれに応じて変化します。
2. マッチングルール
(1) リダイレクト
- アドレスバーにルートアドレスがない場合に
home
ルートにリダイレクトします - デフォルトでは、
Angular
ルーティング ルールに一致する場合、プレフィックスが一致します。path
空の場合は、プレフィックス '/' を持つルーティング接続と一致するため、pathMatch:'full'
ルーティング ルールが完全に一致することを示すために追加する必要があります。
const routes:Routes = [
{
path: 'home', component: HomeComponent},
{
path: 'about', component: AboutComponent},
{
path: '', redirectTo: 'home', pathMatch: 'full'}
];
(2) 404ページ
- ルーティング ルールは上から下に一致します。すべてのルートが一致しない場合は、404 ページを表示する必要があります。
**
これはワイルドカード文字であり、すべてのルートに一致するため、配列の最後に配置する必要があります。
const routes:Routes = [
{
path: 'home', component: HomeComponent},
{
path: 'about', component: AboutComponent},
{
path: '', redirectTo: 'home', pathMatch: 'full'},
{
path: '**', component: NotFoundComponent}
];
3. ルーティングパラメータ
(1) クエリパラメータ
- ルーティング接続を定義する場合、クエリ パラメーターは
[queryParams]
動的バインディングを使用します
<a routerLink="/about" [queryParams]="{name:'zs'}">关于</a>
- 対応するコンポーネントが動的にレンダリングされる場合、渡されたパラメータはコンポーネント内で取得できます。
ActivatedRoute
動的にロードされるコンポーネントに対応するルーティング情報にアクセスするために使用されます。route.queryParamMap
Observable
クエリパラメータ情報を保存するオブジェクトです。get
メソッドを使用して対応する値を取得できます。
import {
ActivatedRoute} from '@angular/router';
export class AboutComponent {
constructor(private route: ActivatedRoute) {
}
ngOnInit() {
this.route.queryParamMap.subscribe(query => {
console.log(query.get('name'));
})
}
}
(2) 動的パラメータ
path
動的パラメータは、ルーティング ルールの属性内でパラメータの位置を予約する必要があります。
{
path: 'about/:name/:age', component: AboutComponent},
- コンポーネント テンプレートは、
routerLink
動的配列をバインドし、パスとパラメーター リストを順番に渡す必要があります。
<a [routerLink]="['/about','zhangsan',78]">关于</a>
- オブジェクトコンポーネントでは、
ActivatedRoute
インスタンスオブジェクトを通じてparamMap
動的パラメータ情報を取得します。
4. サブレベルルーティング
ルートを定義する場合、children
ルートの属性を通じてサブレベルのルートを定義できます。
{
path: 'about',
component: AboutComponent,
children: [
{
path: 'company', component: CompanyComponent},
{
path: 'industry', component: IndustryComponent},
]
},
親ページでAboutComponent
、子ルートのジャンプ リンクを定義し、子ルートのルーティング ソケットを定義します。
<a routerLink="/about/company">公司</a>
<a routerLink="/about/industry">行业</a>
<router-outlet></router-outlet>
5. ナビゲーションルーティング
ナビゲーションルーティングでは、子ルーティング以外のパスへのページジャンプを実現できます。
<button (click)="goHome()">点击跳转到首页</button>
// 需要引入Router模块
constructor(private router: Router) {
}
goHome() {
// 查询参数
this.router.navigate(['/home'],{
queryParams: {
name: 'zhangsan'
}
})
// 动态参数
// this.router.navigate(['/home','zhangsan'])
}
6. ルーティングモジュール
ルーティングの定義に関連するコードを抽出し、管理用に別のモジュールに配置します。
- ルート パスの下にモジュールを定義します
ng g m route --flat=true
。--flat=true
フォルダーは作成されませんが、src/app
関連ファイルは現在のプロジェクトの直下に作成されます。デフォルト値は次のとおりです。false
- ルーティング ルールを定義するコードをモジュール クラスに配置します。
- モジュールクラスにルートを定義してエクスポートする
RouterModule
imports: [
CommonModule,
RouterModule.forRoot(routes, {
useHash: true})
],
exports: [RouterModule]
- 定義されたルーティング モジュールを AppModule にインポートします
imports: [BrowserModule,RouteModule],
7. ルーティングモジュールの遅延ロード
ルーティング モジュールの遅延読み込みにより、ユーザーは初めてアプリケーションをリクエストするときにルート モジュールのみをリクエストでき、ユーザーがアプリケーションにアクセスするときに他のモジュールがロードされるため、ユーザー エクスペリエンスが最適化されます。
- 遅延ロード モジュールを作成します。モジュールの作成中にそれを使用します
--routing=true
。これは、angular-cli
モジュールのルーティング モジュールを作成するのに直接役立ちます。
ng g m sports --routing=true
- モジュールのルートコンポーネントを作成する
ng g c sports
- ルーティング モジュールでルーティングを定義する
sports
; フィーチャー モジュールでルーティングを定義してそれを使用するRouterModule.forChild
パラメータとして受け入れられるルーティング構成配列は 1 つだけです。
import {
SportsComponent} from "./sports.component";
const routes: Routes = [
{
path: '', component: SportsComponent},
];
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule]
})
- ルート ルーティング モジュールのルーティング ルールで、この機能モジュールのロード ルールを定義します。
ルーティング アドレスが の場合、モジュールを/sport
動的にロードします。sport
{
path: 'sports', loadChildren: () => import('./sports/sports.module').then(m => m.SportsModule)},
- ルートコンポーネントテンプレートでジャンプリンクを定義する
<a routerLink="/sports">运动界面</a>
コンソールからは、sources
スポーツ インターフェイスのボタンをクリックすると、sports
モジュールが動的にロードされることがわかります。
8.ルートガード
ルート ガードは、要求されたルートへのナビゲーションが許可されているかどうかをルートに伝えます。
ルート ガードの戻り値には、次の 4 つの状況があります。
- ブール値:
true
アクティブ化できることを示す、false
アクティブ化できないことを示す UrlTree
:Url
新しいツリーにリダイレクトできるツリーを表します。Url
- async を返すことができます。ブール値またはツリー
Promise<boolean | UrlTree>
として解析できる Promise を表します。Url
- を返すことができます: ブール値またはツリー
Observable<boolean | UrlTree>
として解析できる監視可能なオブジェクトを表しますUrl
(1) キャンアクティベート
CanActivate
これはインターフェイスです。ルーティング ガード クラスをカスタマイズする必要があり、ルーティング ガード クラスはこのインターフェイスを実装する必要があります。canActivate
このインターフェイスは、ルートへのアクセスを許可するかどうかを決定するメソッドがクラスに必要であることを規定しています。ルートには複数のガードを適用できます。すべてのガードが許可されている場合にのみ、ルートにアクセスできます。
- ルート ガード クラスを作成し、ルート ガード メソッドを配置します。
ng g guard guards/authGuard
Angular-cli
いくつかの基本的なコードが作成されますが、このメソッドでは、ターゲット ルートへのアクセスが許可されていないことを示すために、canActivate
直接 を返します。false
import {
Injectable} from '@angular/core';
import {
ActivatedRouteSnapshot, CanActivate, RouterStateSnapshot, UrlTree} from '@angular/router';
import {
Observable} from 'rxjs';
// 被Injectable修饰,说明路由守卫类是一个服务类
@Injectable({
providedIn: 'root'
})
// AuthGuardGuard:路由守卫类
export class AuthGuardGuard implements CanActivate {
// canActivate:路由守卫方法
// 参数:
// route:ActivatedRouteSnapshot:路由快照,包含与当前组件相关的路由的当前瞬间信息。
// state:RouterStateSnapshot:路由状态快照,表示路由器在当前瞬间的状态
canActivate(
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
return false;
}
}
- ルーティング ルールの対応するルートにルート ガードを適用します。
{
path: 'user',
loadChildren: () => import('./user/user.module').then(m => m.UserModule),
canActivate: [AuthGuardGuard]
},
(二)CanActivateChild
特定のルートの子ルートにアクセスできるか確認する
- ルーティング ガード クラスを作成し
ng g guard about/about
、選択しますCanActivateChild
canActivateChild
メソッドの戻り値を次のように変更します。false
- このガードを対応するルートに適用すると、
about
ルートの 2 つのサブルートを無効にできます。
{
path: 'about',
component: AboutComponent,
children: [
{
path: 'company', component: CompanyComponent},
{
path: 'industry', component: IndustryComponent}
],
canActivateChild: [AboutGuard]
},
- これら 2 つのジャンプ リンクをクリックしても、ページはジャンプしません。
(3)無効化できる
ユーザーが現在のルートから離れることができるかどうかの検出は、ユーザーがフォーム項目に入力して保存する前に離れるシナリオで使用できます。
ルートを離れることができるかどうかは、ルート ガードが現在適用されているコンポーネントによって異なります。このルート ガードを使用するコンポーネント クラスは、同じ名前のメソッドを定義して、ルート ガードに現在のページを離れることができるかどうかを通知する必要があります。このメソッドは、戻り値を決定するためにルート ガード内で呼び出されます。
- ルート ガード クラスの作成
ng g guard unsave/unsave
- ルートガードクラスには、ルートガードに適用するコンポーネントに定義する必要がある判定機能の種類を指定するインターフェースを定義します。このメソッドでは
canDeactivate
、戻り値はコンポーネントの判定機能に基づいて決定され、戻る場合true
は現在のルートからの離脱が許可されることを意味し、戻る場合false
は離脱が許可されないことを意味します。
export interface CanLeave {
canLeave: () => boolean;
}
export class UnsaveGuard implements CanDeactivate<unknown> {
canDeactivate(
component: unknown,
currentRoute: ActivatedRouteSnapshot,
currentState: RouterStateSnapshot,
nextState?: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
// @ts-ignore
if (component.canLeave()) {
return true;
} else {
if(confirm("是否离开当前页面?")){
return true;
}else{
return false;
}
}
}
}
- ルートが定義されている対応するルートにルート ガードを追加します。
{
path: 'home/:username',
component: HomeComponent,
canDeactivate: [UnsaveGuard]
},
HomeComponent
コンポーネント クラスでは、CanLeave
インターフェイスを実装し、現在のルートが終了できるかどうかをルーティング ガードに伝える値をcanleave
返すメソッドを定義する必要があります。boolean
export class HomeComponent implements CanLeave{
canLeave(): boolean {
return false;
}
}
- ホームページを離れるときにポップアップ ウィンドウが表示されます。[OK] をクリックして終了し、[ルート ジャンプのブロックを解除] をクリックします。
(4) 解決
ルートにジャンプする前に非同期操作を実行してデータを取得し、非同期操作が完了した後にルートジャンプを実行します。
Resolve
ルーティング ガード クラスを作成しますng g resolver resolvers/username
。Resolve クラスもサービス クラスです。resolve
メソッド内で 1 つを返しPromise
、必要なデータを非同期で取得して返します
resolve(
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot
): Promise<String> {
return new Promise<String>((resolve, reject) => {
setTimeout(() => {
resolve("张三");
}, 2000);
})
}
- このルーティング ガードを対応するルートに適用し、ルーティング ルール定義に
resolve
属性を追加します。この属性は配列であり、key
コンポーネントに追加される属性であり、value
対応するデータを取得するルート ガードを指します。
{
path: 'home/:username',
component: HomeComponent,
resolve: {
username: UsernameResolver
}
},
- コンポーネントでは、
this.route.snapshot.data
ルーティング ガードによって渡されたデータを属性を通じて取得できます。
constructor(private route: ActivatedRoute) {
}
ngOnInit(): void {
console.log(this.route.snapshot.data['username'])
}
- ボタンをクリックしてホームページに移動します。ジャンプは 2 秒後に行われ、コンソール出力が表示されます。