SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

次世代Webアプリケーションフレームワーク「Angular」の活用

URLとリンクでコンポーネント表示を切り替える「Angular 2」のルーター

次世代Webアプリケーションフレームワーク「Angular」の活用 第5回


  • X ポスト
  • このエントリーをはてなブックマークに追加

ルーターでコンポーネントにパラメーターを渡す

 ルーターでコンポーネントを切り替えるときに、コンポーネントにパラメーターを渡すことができます。この方法を、図2のサンプル(angular-002-router2)で説明します。このサンプルでは、図中(1)の画面上部リンクに設定されたパスや、(2)のテキストボックスの値から、パラメーターをコンポーネントに渡します。

図2 URLからパラメーターを渡すサンプル(angular-002-router2)
図2 URLからパラメーターを渡すサンプル(angular-002-router2)

URLのパスにパラメーターを含める

 まず、図2(1)のように、URLのパスにパラメーターを含める方法を説明します。ルーターへのルート指定をリスト4のように記述します。

リスト4 パスでパラメーターを渡す設定(angular-002-router2/app/app.module.ts)
RouterModule.forRoot([
  // URLの「:id」部分がパラメーター名を表す
  { path: "comp1/:id", component: Comp1Component },
  (以下略)
])

 パスに指定された「comp1/:id」記述で、パラメーター名としてidを指定しています。この記述に対応させて、リスト5のようにリンクに「/comp1/25」と指定すると、「25」の部分がidパラメーターの値と解釈されて、コンポーネントに渡されます。

リスト5 リンクのパスにパラメーターを設定(angular-002-router2/app/app.component.ts)
<a routerLink="/comp1/25" routerLinkActive="active">...</a>

 リスト5と同じ動作をするリンクを、リスト6のようにも記述できます。

リスト6 別のパラメーター記述法(angular-002-router2/app/app.component.ts)
<a [routerLink]="['/comp1', 25]" routerLinkActive="active">...</a>

 routerLinkを囲む[]は、「=」の右側に記述された内容をJavaScriptとして解釈して、routerLink属性に設定することを表します。設定されるJavaScript配列の第1要素にパス(/comp1)、第2要素にパラメーター(25)を指定します。

 リスト5、6で渡されたパラメーターをコンポーネントで受け取る処理はリスト7です。

リスト7 パラメーターを受け取る処理(angular-002-router2/app/comp1.component.ts)
constructor(private route: ActivatedRoute) {       // ...(1)
  this.route.params.forEach((params: Params) => {  // ...(2)
    this.id = params["id"];                        // ...(3)
  });
}

 (1)のActivatedRouteオブジェクトrouteは、ルートの情報を格納したオブジェクトで、依存性注入によりコンストラクタに渡されます。(2)と(3)で、routeのparamsプロパティからパラメーター名idを指定して値を取り出しています。サンプルコードでは、(3)のthis.idがデータバインディングによって画面に表示されます。

[参考]Angular 2とReactive Extensions

 Angular 2では、内部的にJavaScript版のReactive Extensions(Rx)が利用されています。Rxでは、状態の変化を表すObservableオブジェクトを購読(Subscribe)しておくと、状態が変化したときに処理を実行できます。Rxの詳細については公式ページも参考にしてください。

 リスト7(2)のthis.route.paramsは、パラメーターの変化を表すObservableで、forEachメソッドはObservableを購読する処理、ParamsクラスのparamsはObservableからデータを受け取るオブジェクト(Observer)になっています。

JavaScriptでルーターを操作してパラメーターを渡す

 図2(2)のように、テキストボックスの値をパラメータとして渡すには、リスト8のようにJavaScriptの処理でルーターを操作します。

リスト8 JavaScriptでルーターを操作(angular-002-router2/app/app.component.ts)
/**
 * コンストラクター ...(1)
 */
constructor(private router:Router) {
}
/**
 * ボタン押下時の処理 ...(2)
 */
onClickButton(){
  this.router.navigate(["/comp1", this.value1]);
}

 (1)のコンストラクターで、ルーター自身を表すRouterオブジェクトrouterを依存性注入で受け取ります。ボタン押下時の処理(2)で、router.navigateメソッドにパス(/comp1)とテキストボックスの値(this.value1)を含む配列を指定して実行すると、ルーターがコンポーネントにパラメーターを渡して画面切り替えを行います。リスト8で渡されたパラメーターを受け取る処理は、リンクの場合と同一(リスト7)です。

複数のパラメーターを渡す方法

 サンプル2ではパラメーターの数が1個でしたが、複数のパラメーターを同時に渡す方法もあります。リンクではリスト9のように、routerLink属性の配列第2要素に、複数のパラメーターを含むJavaScrictオブジェクトを指定します。

リスト9 複数のパラメーターを渡すリンク(angular-003-router3/app/app.component.ts)
<a [routerLink]="['/comp1', {'id': 1234, 'msg': 'Hello'}]"
  routerLinkActive="active">...</a>

 JavaScriptではリスト10のように、router.navigateメソッドに渡す配列の第2要素にJavaScriptオブジェクトを指定します。

リスト10 複数のパラメーターを渡すJavaScript処理(angular-003-router3/app/app.component.ts)
this.router.navigate(["/comp1", {"id": this.value1, "msg": this.value2}]);

 リスト9、10を含んだサンプル(angular-003-router3、図3)の詳細は、ダウンロードできるサンプルコードを参照してください。

図3 複数のパラメーターを渡すサンプル(angular-003-router3)
図3 複数のパラメーターを渡すサンプル(angular-003-router3)

次のページ
コンポーネントへの遷移を防ぐガード

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
次世代Webアプリケーションフレームワーク「Angular」の活用連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト  吉川 英一(ヨシカワ エイイチ)

WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS Twitter: @yyamada(公式)、@yyamada/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/9887 2017/04/24 11:02

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング