SHOEISHA iD

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

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

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

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

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


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

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

 一般にWebアプリでは、未認証時や編集内容を保存していない場合など、画面遷移をガードしたいときがあります。このような目的で、ルーターには表3のガード機能があります。

表3 Angular 2のルーターが備えるガード機能
名前 主な機能
CanActivate ルートへの遷移をガード
CanActivateChild 子ルートへの遷移をガード
CanDeactivate 現在コンポーネントからの退出をガード
Resolve 特定処理完了まで遷移をガード
CanLoad 不必要なモジュールのロードをガード

 本記事では、CanActivateとCanDeactivateガードについて、図4のサンプル(angular-004-router4)で説明します。このサンプルでは、適切なユーザー名を入力しないとコンポーネントに遷移できず、ログアウト許可のチェックボックスをチェックしないとコンポーネントから退出できません。

図4 コンポーネント切り替えをガードするサンプル(angular-004-router4)
図4 コンポーネント切り替えをガードするサンプル(angular-004-router4)

 ガード処理はサービス(TypeScriptクラス)に実装して、リスト11の(1)(2)のようにルーターの設定で指定します。

リスト11 ガード処理サービスの登録(angular-004-router4/app/app.module.ts)
RouterModule.forRoot([
  {
    path: "comp1/:username",
    component: Comp1Component,
    // 遷移時のガード処理サービス指定 ...(1)
    canActivate: [ActivateGuardService],
    // 退出時のガード処理サービス指定 ...(2)
    canDeactivate: [DeactivateGuardService],
  },
(以下略)

 遷移時のガード処理を実行するサービスActivateGuardServiceはリスト12のようになります。

リスト12 遷移時のガード処理(angular-004-router4/app/activateguard.service.ts)
@Injectable()
export class ActivateGuardService
implements CanActivate { // インターフェイスを設定 ...(1)
  /**
   * ガード判定処理 ...(2)
   */
  canActivate(
    route: ActivatedRouteSnapshot,
    state: RouterStateSnapshot) {
    // ユーザー名が一致した場合はtrueを返して、画面遷移を許可する
    if (route.params["username"] == "yoshikawa") {
      return true;
    }
    // それ以外はfalseを返して、画面遷移を許可しない
    else {
      alert("許可されたユーザーではありません。")
      return false;
    }
  }
}

 遷移時のガード処理を表すCanActivateインターフェイスを(1)で設定しています。インターフェイス実装は(2)のcanActivateメソッドで、遷移を許可するかどうかをtrueまたはfalseの戻り値で指定します。引数のActivatedRouteSnapshotはその時点のルート状態を表し、指定されたパラメーターなどが取得できます。RouterStateSnapshotはその時点のルーター自身の状態を表し、URLなどが取得できます。ここでは指定されたusernameパラメーターを受け取り、その内容で遷移するかどうかを判定しています。

 同様に、退出時のガード処理を実行するには、サービスのTypeScriptクラスにCanDeactivateインターフェイスのメソッド(canDeactiate)を実装して、退出を許可するかどうかをtrueかfalseの戻り値で指定します。実装内容はサンプルコード(angular-004-router4)のapp/deactivateguard.service.tsファイルを参照してください。

まとめ

 本記事では、Angular 2でコンポーネントとURLを対応付けて表示を切り替えるルーターの機能を紹介しました。ルーターを利用すると、コンポーネントの表示切り替えをシンプルに行うことができ、コンポーネントに対応したURLがアドレスバーに表示されたり、Webブラウザーの「進む」「戻る」ボタンで画面遷移できるなど、一般的なWebページと似た使い勝手を提供できます。

参考資料

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

  • 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」など、さまざまなカンファレンスを企画・運営しています。

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

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

メールバックナンバー

アクセスランキング

アクセスランキング