Angular のルーティングの基本とRoutes の使い方
Angularにはルーティングという機能があります。描画領域をコントロールする仕組みです。
ルーティングを実現させるには、RoutesとRouterModuleをインポートする必要があります。
import { Routes, RouterModule } from '@angular/router';
ルーティングは複数個所存在する可能性があるため、モジュールとしてファイルを作成したほうが良いと思います。
app.route.module.ts
import { Routes, RouterModule } from '@angular/router';
import { NgModule } from '@angular/core';
import { AppComponent } from './app.component';
import { AbcComponent } from './abc/abc.component';
const routes: Routes = [
{path:'', component: AppComponent},
{path:'disp', component: AbcComponent, outlet: 'aaa'} // 複数あればカンマ区切りで定義していく
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRouteModule{}
上記は、定義の順番が関係あり、上から順にpathがmatchするコンポーネントが使用されます。本来は、ルーティングで利用するコンポーネントはdeclarationsで指定しますが、上記のように別ファイルでモジュールにしておくと、ルートモジュールが簡潔に書けるため良いと思います。
app.module.ts(ルートモジュール)
import { AppRouteModule } from './app.route.module';
// 省略
imports: [
AppRouteModule // 追加
],
// 省略
Router.navigateメソッドを使用する
テンプレート(ビュー)には以下のようにrouter-outletタグを記述してルータによる描画領域を定義します。
<router-outlet></router-outlet>
上記で問題ないのですが、描画領域が複数存在する場合は区別をつけるために名前付きoutletを設定します。具体的にはname属性を追加するだけです。
<router-outlet name='aaa'></router-outlet>
基本的には名前付きoutletを使用しておいたほうが良いと思います。
描画領域をルータ経由で表示、非表示してみます。navigateメソッドで実現します。
app.component.ts
import { Component } from '@angular/core';
import { Router } from '@angular/router';
@Component({
selector: 'app-root',
template:
`
<button (click)='onClick1()'>表示ボタン</button>
<br>
<button (click)='onClick2()'>非表示ボタン</button>
<br>
<div>
<router-outlet name='aaa'></router-outlet>
</div>
`,
styleUrls: ['./app.component.css']
})
export class AppComponent {
constructor(private router: Router){}
onClick1() { // name属性で指定した値とキーをマッピングし、pathで指定した値とoutletsの値をマッピングする
this.router.navigate([ { outlets: {'aaa': 'disp'}}]);
}
onClick2() { // nullにすることで非表示にする
this.router.navigate([ { outlets: {'aaa': null}} ]);
}
}
表示させるとURLが変わってしまいます。
URLを変更しないように設定する(skipLocationChange)
ルーティング機能を使ってもURLを変更させないようにしたい場合、skipLocationChangeをtrueにすることで変更させないようにすることができます。
以下、skipLocationChangeをtrueにした例です。
onClick1() {
this.router.navigate([ { outlets: {'aaa': 'disp'} } ],{skipLocationChange: true});
}
onClick2() {
this.router.navigate([ { outlets: {'aaa': null}} ],{skipLocationChange: true});
}
RouterModule.forRootを使わない記述方法(standalone)
v14.2以降、provideRouterでルーティング設定を行えるようになっています。
各コンポーネントのstandaloneはtrueにしておく必要があります。
import { provideRouter } from '@angular/router'
bootstrapApplication関数のproviders配列に要素を追加します。
import { bootstrapApplication,provideProtractorTestingSupport } from '@angular/platform-browser';
import { AppComponent } from './app/app.component';
import { provideRouter } from '@angular/router';
import routeConfig from './app/routes'; // ★ routes.tsファイル追加
bootstrapApplication(AppComponent,
{
providers: [
provideProtractorTestingSupport(),
provideRouter(routeConfig) // ★ 追加
]
}
).catch(err => console.error(err));
routes.ts(サンプル)
import { Routes } from '@angular/router';
import { AppComponent } from './app.component';
import { AbcComponent } from './abc/abc.component';
const routeConfig: Routes = [
{
path: '',
component: AppComponent,
title: 'Home page'
},
{
path: 'details/:id',
component: AbcComponent,
title: 'Home details'
}
];
export default routeConfig;
routerLinkディレクティブを使用する
Aタグでリンク作成してルーティングするにはrouterLinkディレクティブを使用します。
<a [routerLink]="['/details']">xxx</a>
リンクをクリックすると関連するコンポーネントが<router-outlet>にレンダリングされます。
URLを変更しないようにするためには[skipLocationChange]="true"を追記します。
<a [routerLink]="['/details']" [skipLocationChange]="true">xxx</a>

KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES20xx),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^


