はじめに
Angular 2は、Googleとオープンソースコミュニティで開発されているJavaScriptフレームワークで、従来のAngularJS(AngularJS 1)の次期バージョンです。Angular 2はAngularJS 1に対して多くの変更点があり、コードの記述法も基本的に異なります。
Angular 2では、Webページ内にコンポーネントを配置して画面を構成します。このときに「ルーター」機能を利用すると、コンポーネントにそれぞれURLのパスを対応付けて、Webページのリンクでコンポーネントを切り替え表示できます。Webブラウザの履歴機能も利用でき、通常のWebページ遷移と同じように操作できるメリットがあります。
本記事では、Angular 2のルーターを利用する方法について、サンプルとともに説明していきます。
対象読者
- 正式版になったので本格的にAngular 2を使い始めようと思っている方
 - 最新フレームワークに触れておきたい方
 - 通常のWebページのような挙動を期待する方
 
必要な環境
Angular 2はJavaScriptのフレームワークですが、公式WebサイトのドキュメントやサンプルはTypeScript向けが先行して整備される場合が多く、本連載でもTypeScriptでコードを記述していきます。また、サンプルの実行にはNode.jsが必要になります。
今回は以下の環境で動作を確認しています。
- 
      Windows 10 64bit版
      
- Angular 2 2.1.1
 - Node.js v6.9.1 64bit版
 - Microsoft Edge 38.14393.0.0
 
 
ダウンロードできるサンプルには、Angular 2で開発を始めるもととなる、クイックスタートプロジェクト(angular-quickstart)を含めています。プロジェクトのフォルダーでNode.jsのコマンド「npm install」を実行してライブラリをインストール後、「npm start」コマンドで実行できます。プロジェクトの実行方法については過去記事も参照してください。なお、Angular 2の各バージョンに対応したクイックスタートプロジェクトが、GitHubで公開されています。
ルーターでコンポーネントを切り替える実装
最初に、複数のコンポーネントを切り替える単純なサンプル(angular-001-router1)で、ルーターの利用方法を説明します。このサンプルでは、図1のように、画面上部のリンクをクリックして、画面下部のコンポーネントを切り替え表示できます。このとき、コンポーネントに対応するURLがブラウザーのアドレスバーに表示されます。また、ブラウザーの「戻る」「進む」ボタンで画面遷移できます。
 まず、ルーターが内部的にページ履歴操作で利用しているHTML5のpushStateメソッドが正しく動作するように、index.htmlのhead要素先頭にbaseタグを追加します。baseタグは相対パスで記述されたURLの基準を指定するもので、このサンプルのURLには「http://localhost:xxxx/」のようにサブパスがないため、"/"と指定します。
<head> <base href="/"> <!-- headタグの先頭に指定 --> (以下略)
次に、Webページのルートモジュールを定義するapp.module.tsに、コンポーネントとルーターの定義をリスト2のように記述します。
// Angular 2のモジュール参照 ...(1)
import { NgModule }       from "@angular/core";
import { BrowserModule }  from "@angular/platform-browser";
import { RouterModule }   from "@angular/router"
// コンポーネント参照 ...(2)
import { AppComponent }   from "./app.component";
import { HomeComponent }  from "./home.component";
import { Comp1Component } from "./comp1.component";
import { Comp2Component } from "./comp2.component";
import { ErrorComponent } from "./error.component";
 
@NgModule({
  imports:      [
    BrowserModule,
    // ルーターにルートを指定 ...(3)
    RouterModule.forRoot([
      { path: "comp1", component: Comp1Component },
      { path: "comp2", component: Comp2Component },
      { path: "", component: HomeComponent },
      { path: "**", component: ErrorComponent }
    ])
  ],
(以下略)
  (1)でAngular 2のモジュールを参照しています。モジュール定義に用いるNgModule、Webブラウザーでの実行に必要となるBrowserModuleに加えて、ルーターの定義に必要なRouterModuleを参照しています。(2)はWebページのルートコンポーネント(AppComponent)と、ルーターで切り替え表示する各コンポーネントの参照です。AppComponent以外は、HTMLテンプレートだけが指定された単純なコンポーネントです。
ルーターの設定記述は(3)になります。RouterModule.forRootの中に「コンポーネントに対応するパスの情報」を指定します。このような情報を「ルート」と呼びます。なお、ルートコンポーネント(AppComponent)以外のコンポーネントにルートを設定する場合は、forRootの代わりにforChildメソッドを用います。
リスト2(3)の指定内容は表1のようになります。
| No. | パス | 対応するURL | 表示するコンポーネント | 
|---|---|---|---|
| 1 | comp1 | http://localhost:xxxx/comp1 | Comp1Component | 
| 2 | comp2 | http://localhost:xxxx/comp2 | Comp2Component | 
| 3 | (空文字) | http://localhost:xxxx/ | HomeComponent | 
| 4 | ** | http://localhost:xxxx/(任意のパス) | ErrorComponent | 
例えば、URLが「http://localhost:xxx/comp2」の場合、Comp2Componentコンポーネントが表示されます。ルートは上から順に評価されるため、ホームを表す空文字や、「その他」を表す**のルートは、最後に指定する必要があります。
forRoot/forChildメソッドに指定するルートのオブジェクトには、pathとcomponentのほかに表2のようなオプションを指定できます。outletオプションと<router-outlet>タグについては後述します。また、childrenオプションを利用すると、「/comp1/child1Comp1」のようなサブパスに対応するルート(子ルート)を指定できます。詳細は公式ドキュメントを参照してください。
| オプション名 | 指定内容 | 
|---|---|
| pathMatch | パスの照合方法(prefix:前方一致、full:完全一致、デフォルトはprefix) | 
| redirectTo | ルートへのアクセスを転送する別のパス | 
| outlet | ルーターがコンポーネントを表示する<router-outlet>タグの名前 | 
| children | ルートにサブパスが指定したときに評価される子ルートのリスト | 
表示を切り替えるリンクや、コンポーネントの表示場所は、リスト3のように記述します。
<!-- ルーターで表示を切り替えるリンク ...(1) --> <a routerLink="/comp1" routerLinkActive="active">コンポーネント1</a> <a routerLink="/comp2" routerLinkActive="active">コンポーネント2</a> <a routerLink="/dummy" routerLinkActive="active">不正なURL</a> <!-- ルーターがコンポーネントを表示する場所 ...(2)--> <router-outlet></router-outlet>
(1)のように、aタグのrouterLink属性にパスを「/comp1」のように指定します。routerLinkActive属性は、対応するコンポーネントが画面表示されているときに、リンクに設定されるCSSクラスです。ここでは「active」クラスを指定して、赤色太字になるようにCSS(styles.css)に記述しています。
(2)の<router-outlet>タグは、ルーターがコンポーネントを表示する場所の指定です。なお、<router-outlet>タグにname属性で名前をつけて、表2のoutletパラメーターにその名前を指定すると、ルーターがコンポーネントを出力する<router-outlet>タグを指定できます。
リスト1~3を実行すると、初期状態では表1のNo.3に対応するHomeComponentが表示され、画面上部のリンク押下で、リンクのパスに対応するコンポーネントが切り替え表示されます。「不正なURL」リンクのパス「/dummy」は明示的に定義されていないので、表1のNo.4(その他すべて)に対応するErrorComponentが表示されます。
