Angularルーティングの達人になる:ActivatedRouteとActivatedRouteSnapshotを使いこなすテクニック
Angular における ActivatedRoute と ActivatedRouteSnapshot の違い
ActivatedRoute
- コンポーネントのコンストラクタで注入されます。
- 購読することで、ルート情報の変更を検知できます。
- 現在のルートパラメータ、クエリパラメータ、データ、URL へのアクセスを提供します。
- アクティブなルートに関する情報を提供する オブザーバブル です。
ActivatedRouteSnapshot
- ルーターガードやルートプレフックで使用されます。
- 変更することはできません。
- 特定時点におけるルート情報の 静的スナップショット です。
使い分け
- 特定時点におけるルート情報のみが必要な場合は、
ActivatedRouteSnapshot
を使用します。 - ルート情報が変化する可能性がある場合は、
ActivatedRoute
を使用します。
例
- コンポーネントで現在のルートパラメータにアクセスするには、
ActivatedRoute
を使用します。
constructor(private route: ActivatedRoute) {
this.route.params.subscribe(params => {
this.id = params['id'];
});
}
- ルーターガードで特定のルートパラメータが存在するかどうかを確認するには、
ActivatedRouteSnapshot
を使用します。
canActivate(route: ActivatedRouteSnapshot): boolean {
const id = route.params['id'];
return id != null;
}
- それぞれの特性を理解して使い分けることが重要です。
ActivatedRouteSnapshot
は特定時点におけるルート情報の静的スナップショットです。ActivatedRoute
はアクティブなルートに関する情報を提供するオブザーバブルです。
ActivatedRoute
とActivatedRouteSnapshot
は、Angular 2 から導入されました。
この例では、ActivatedRoute
を使用して現在のルートパラメータ (id
) にアクセスし、コンポーネントの id
プロパティに設定します。
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
@Component({
selector: 'app-user-detail',
templateUrl: './user-detail.component.html',
styleUrls: ['./user-detail.component.css']
})
export class UserDetailComponent implements OnInit {
id: number;
constructor(private route: ActivatedRoute) { }
ngOnInit(): void {
this.route.params.subscribe(params => {
this.id = params['id'];
});
}
}
ルーターガードで特定のルートパラメータが存在するかどうかを確認
この例では、ActivatedRouteSnapshot
を使用して、特定のルートパラメータ (id
) が存在するかどうかを確認するルーターガードを作成します。
import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, CanActivate } from '@angular/router';
@Injectable({
providedIn: 'root'
})
export class IdGuard implements CanActivate {
canActivate(route: ActivatedRouteSnapshot): boolean {
const id = route.params['id'];
return id != null;
}
}
このガードを user-detail
コンポーネントのルート設定に追加することで、id
パラメータが存在しない場合はコンポーネントにアクセスできなくなります。
{
path: 'users/:id',
component: UserDetailComponent,
canActivate: [IdGuard]
}
機能 | ActivatedRoute | ActivatedRouteSnapshot |
---|---|---|
情報の種類 | アクティブなルートに関する情報 | 特定時点におけるルート情報の静的スナップショット |
変更可能性 | 変更可能 | 変更不可 |
用途 | 現在のルートパラメータ、クエリパラメータ、データ、URL へのアクセス、ルート情報の変更を検知 | 特定時点におけるルートパラメータ、クエリパラメータ、データ、URL へのアクセス |
使用例 | コンポーネントで現在のルートパラメータにアクセス | ルーターガードで特定のルートパラメータが存在するかどうかを確認 |
- 複雑なアプリケーションでは、より高度なテクニックが必要になる場合があります。
ActivatedRoute
オブジェクトは、params
と queryParams
プロパティを使用して、ルートパラメータとクエリパラメータにアクセスできます。
constructor(private route: ActivatedRoute) {
this.route.params.subscribe(params => {
this.id = params['id'];
});
this.route.queryParams.subscribe(queryParams => {
this.filter = queryParams['filter'];
});
}
ActivatedRoute のデータプロパティにアクセス
ActivatedRoute
オブジェクトは、data
プロパティを使用して、ルートデータにアクセスできます。ルートデータは、コンポーネント間で共有できる任意の情報を含めることができます。
constructor(private route: ActivatedRoute) {
this.route.data.subscribe(data => {
this.user = data['user'];
});
}
ActivatedRoute
オブジェクトは、url
プロパティを使用して、現在の URL にアクセスできます。
constructor(private route: ActivatedRoute) {
this.route.url.subscribe(urlSegments => {
this.currentUrl = urlSegments.join('/');
});
}
ActivatedRoute
オブジェクトは、urlTree
プロパティを使用して、現在の URL ツリーにアクセスできます。URL ツリーは、URL の各セグメントと関連する情報を提供します。
constructor(private route: ActivatedRoute) {
this.route.urlTree.subscribe(urlTree => {
const id = urlTree.params['id'];
this.id = id != null ? parseInt(id, 10) : null;
});
}
ActivatedRouteSnapshot
オブジェクトは、params
と queryParams
プロパティを使用して、ルートパラメータとクエリパラメータにアクセスできます。これらのプロパティは静的であり、変更することはできません。
canActivate(route: ActivatedRouteSnapshot): boolean {
const id = route.params['id'];
return id != null;
}
canActivate(route: ActivatedRouteSnapshot): boolean {
const user = route.data['user'];
return user != null && user.isAdmin;
}
canActivate(route: ActivatedRouteSnapshot): boolean {
const url = route.url[0].path;
return url === 'admin';
}
canActivate(route: ActivatedRouteSnapshot): boolean {
const id = route.urlTree.params['id'];
return id != null && parseInt(id, 10) > 0;
}
angular angular-routing angular2-router