Angularルーティング
4863 ワード
概要
ルーティングが解決すべき核心的な問題は,URLとページの対応関係を確立することによって,異なるページが異なるURLで表すことができるようにすることである.
Angularルーティングのコアワークフローチャート
基本的な使い方
Angularルーティングの最も基本的な使い方は、1つのURLに対応するコンポーネントをページに表示することです.これを行うには、 、 、
の3つの必須のステップがあります.
ルートルーティングモジュールの作成
ルートルーティングモジュールは、ルーティングに必要な各サービスを含み、ルーティングワークフローが正常に実行される基礎である.
次のコードはルート構成rootRouterConfigをパラメータとしてRouterModuleを呼び出す.forRoot()メソッドは、ルートルーティングモジュールを作成し、アプリケーションのルートモジュールAppModuleにインポートします.
app-routing.module.ts const rootRouterConfig: Routes = [
{
path: 'add',
component: AddComponent,
},
{
path: 'list',
component: ListComponent,
},
{
path: '',
redirectTo: 'add',
pathMatch: 'full',
},
{
path: '**',
redirectTo: 'add',
pathMatch: 'full',
}
];
@NgModule({
imports: [RouterModule.forRoot(rootRouterConfig)],
exports: [RouterModule]
})
export class AppRoutingModule { }
const rootRouterConfig: Routes = [
{
path: 'add',
component: AddComponent,
},
{
path: 'list',
component: ListComponent,
},
{
path: '',
redirectTo: 'add',
pathMatch: 'full',
},
{
path: '**',
redirectTo: 'add',
pathMatch: 'full',
}
];
@NgModule({
imports: [RouterModule.forRoot(rootRouterConfig)],
exports: [RouterModule]
})
export class AppRoutingModule { }
ルーティングポリシー
HashLocationStrategy
http://localhost:4200/#/add
HashLocationStrategyはAngularルーティングで最も一般的なポリシーであり、hash部分を処理するブラウザの特性を利用することを原理としています.
ブラウザがサーバに要求を送信する際にhash部分の内容を持ち込まず、URLを変更したhash部分がサーバに要求を再送信しないため、ジャンプを行う際にページのリフレッシュやアプリケーションの再ロードが起こらない
このポリシーは,ルーティングサービスを注入する際にuseHash属性を用いて表示指定するだけでよい.
app-routing.module.ts @NgModule({
imports: [RouterModule.forRoot(rootRouterConfig, { useHash: true })],
exports: [RouterModule]
})
HashLocationStrategy
ルーティングジャンプ
Webアプリケーションにおけるページジャンプとは、あるイベントに応答して、あるページから別のページにジャンプする動作を指す.Angularが構築した単一ページの場合、ページジャンプは実質的に1つの構成項目から別の構成項目にジャンプする動作である.
コマンドジャンプ
命令ホッピングはRouterLink命令を用いて行われ,この命令はリンクパラメータ配列を受信し,Angularはその配列に基づいてUrlTreeインスタンスを生成してホッピングするadd
list
最初のパラメータ名は、/、./を使用できます.または.../接頭辞
http://localhost:4200/#/add
@NgModule({
imports: [RouterModule.forRoot(rootRouterConfig, { useHash: true })],
exports: [RouterModule]
})
Webアプリケーションにおけるページジャンプとは、あるイベントに応答して、あるページから別のページにジャンプする動作を指す.Angularが構築した単一ページの場合、ページジャンプは実質的に1つの構成項目から別の構成項目にジャンプする動作である.
コマンドジャンプ
命令ホッピングはRouterLink命令を用いて行われ,この命令はリンクパラメータ配列を受信し,Angularはその配列に基づいてUrlTreeインスタンスを生成してホッピングする
add
list
最初のパラメータ名は、/、./を使用できます.または.../接頭辞
RouterLinkコマンドは、ページジャンプがハイパーリンクに依存する必要がないように、任意のHTML要素に適用できます.
コードジャンプ
RouterLink命令は、clickイベントに応答するページジャンプを実現し、他のイベントに応答したり、実行時に応じて動的にジャンプする必要がある場合はRouterを通過することができる.navigateByUrlまたはRouter.navigateで完成します.
add() {
this.router.navigateByUrl('/add');
}
list() {
this.router.navigate(['/list']);
}
ルーティングパラメータ
Pathパラメータ
PathパラメータはURLのpath部分を解析することによりパラメータを取得する.
コンフィギュレーション・アイテムのpathプロパティを定義する場合は、/文字を使用してpathプロパティをセグメント化できます.セグメントが文字で始まると、URLのセグメントと一致する部分がパラメータとしてコンポーネントに渡されます.
app-routing.module.ts const rootRouterConfig: Routes = [
{
path: 'add/:id/:name/:age/:sex',
component: DetailComponent,
}
];
detail 1 tao1 30 man
コンポーネントでPathパラメータを取得するには、ページ間のジャンプを処理する2つの方法を提供するActivatedRouteサービスをインポートする必要があります.
異なるページ
Angularアプリケーションは、1つのページから別の新しいページにジャンプし、実質的には1つの構成項目から別の構成項目にジャンプします.このプロセスでAngularは、コンフィギュレーション・アイテムに対応するコンポーネントのインスタンスを作成するほか、現在のURLから解析されたすべてのpathパラメータを記録するスナップショット(snapshot)を含むコンフィギュレーション・アイテムがアクティブになっていることを示すActivityインスタンスを作成します.ngOnInit() {
console.log(this.activatedRouter.snapshot.params);
}
{id: "1", name: "tao", age: "30", sex: "man"}
同一ページ
Angularは同じページを処理しても、コンポーネントを作成したインスタンスは再現されないので、コンストラクション関数とngOnInit()メソッドは呼び出されません.Angularはスナップショットのパラメータを更新しますが、コンポーネントに値は更新されません.この問題を解決するために、ActivatedRouteサービスは、パラメータの更新を購読できるObservableオブジェクトを提供します.コンポーネントが破棄されると、購読をキャンセルします.this.activatedRouter.params.subscribe(value => {
console.log(value);
})
ngOnDestroy() {
this.sub.unsubscribe();
}
Queryパラメータ
URLのqueryセクションはコンフィギュレーション・アイテムと一致しないため、各コンフィギュレーション・アイテムは任意の複数のクエリー・パラメータを持つことができます.http://localhost:4200/list?limit=10
Queryパラメータは、RouterLink命令またはジャンプメソッドによっても同様に割り当てることができます.>detail limit 10
>detail limit 30
Queryパラメータの取得は、ActivatedRouteサービスが提供するObservableオブジェクトのqueryParamsによって行う必要があります.this.sub2 = this.activatedRouter.queryParams.subscribe(value => {
console.log(value);
})
// {limit: "10"}
ルーティングブロック
const rootRouterConfig: Routes = [
{
path: 'add/:id/:name/:age/:sex',
component: DetailComponent,
}
];
detail 1 tao1 30 man
ngOnInit() {
console.log(this.activatedRouter.snapshot.params);
}
{id: "1", name: "tao", age: "30", sex: "man"}
this.activatedRouter.params.subscribe(value => {
console.log(value);
})
ngOnDestroy() {
this.sub.unsubscribe();
}
http://localhost:4200/list?limit=10
>detail limit 10
>detail limit 30
this.sub2 = this.activatedRouter.queryParams.subscribe(value => {
console.log(value);
})
// {limit: "10"}