SHOEISHA iD

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

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

AngularJSアプリ開発を支援する便利モジュール

AngularJSアプリにマルチビュー/入れ子にも対応したルーティング機能を実装する(UI Router)

AngularJSアプリ開発を支援する便利モジュール 第4回

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

ビューを入れ子にする

 さらに、UI Routerではビューを入れ子にすることもできます。たとえば、/membersではメンバーの一覧情報を表示し、一覧から特定のメンバーを表示すると、それぞれ/members/1、/members/7のようなパスで個別メンバーの情報が表示される、といったケースです。

入れ子になったビューを定義
入れ子になったビューを定義

 このようなルートは、以下のように定義できます。

リスト6 nest.html
<!DOCTYPE html>
<html ng-app="myApp">
<head>
<meta charset="UTF-8" />
<title>AngularJS</title>
<script src="bower_components/angular/angular.min.js"></script>
<script src="bower_components/angular-ui-router/release/angular-ui-router.min.js"></script>
<script src="scripts/nest.js"></script>
</head>
<body>
<div ui-view></div>
</body>
</html>
リスト7 nest.js
angular.module('myApp', [ 'ui.router' ])
  .config(['$stateProvider', '$urlRouterProvider', function($stateProvider, $urlRouterProvider) {
    $stateProvider
      // membersステートを準備
      .state('members', {
        url: '/members',
        controller: ['$scope', 'GetMembers', function($scope, GetMembers) {
          $scope.members = GetMembers();
        }],
        template: '<ul>' +
                  '<li ng-repeat="(id, member) in members">' +
                  '<a ui-sref=".details({ id: id })">' +
                  '{{member.name}}</a></li>' +
                  '</ul><hr />' +
                  '<div ui-view></div>'
      })
      // membersステートの子ステートmembers.detailsを準備
      .state('members.details', {
        url: '/:id',
        controller: ['$scope', '$stateParams', 'GetMembers',
          function($scope, $stateParams, GetMembers) {
          $scope.member = GetMembers()[$stateParams.id];
        }],
        template: '<table class="table">' +
                  '<tr>' +
                  '<th>名前</th>' +
                  '<td>{{member.name}}</td>' +
                  '</tr>' +
                  '<tr>' +
                  '<th>性別</th>' +
                  '<td>{{member.sex}}</td>' +
                  '</tr>' +
                  '<tr>' +
                  '<th>誕生日</th>' +
                  '<td>{{member.birth | date : "yyyy年MM月dd日"}}</td>' +
                  '</tr>' +
                  '</table>'
      });
      $urlRouterProvider.otherwise('/members');
  }])
  // メンバー情報を取得するためのGetMembersサービス
  .value('GetMembers', function() {
    return {
      '1' : {
        name: '佐藤理央',
        sex: '女',
        birth: new Date(2000, 5, 25)
      },
      ...中略...
    };
  });

 ステートを入れ子にした場合のポイントは、以下の通りです。

(1)ステート名はドット区切りで表現

 UI Routerでは、入れ子(階層)関係にあるステートをドット区切りで表すのが基本です。たとえば、この例であれば、members.detailsステートは、membersステートの子ステートであるという意味です。

(2)urlパラメーターは連結して解釈される

 ステートが階層関係にある場合、urlパラメーターも「親のurl + 子のurl」と階層に即して連結されます。この例であればmembersステートのurlは「/members」、members.detailsステートのurlは「/:id」なので、members.detailsステートは、これらを連ねたもの「/members/:id」――たとえば「/members/13」のようなパスで呼び出せます。

(3)親テンプレートに子テンプレートの埋め込み先を準備する

 ステートを階層関係にした場合、(デフォルトでは)子テンプレートもまた、親テンプレートの子供として埋め込まれます。よって、この場合も親テンプレートの中に子テンプレートの埋め込み先(ui-view属性)を準備しています。

 また、ui-sref属性でリンク先を指定する場合、先頭に「.」を付けている点にも注目です。これはいわゆる相対パスを示すもので、(現在がmembersステートを示しているはずなので)members.detailsステートにリンクしなさい、という意味になります。「members.details({ id: id })」と書いても同じ意味です。

まとめ

 以上、本稿ではngRouteモジュールによく似た構文で、より高機能なルーティングを提供するUI Routerについて解説しました。ルーティングは、複数のファイルが関連して動作するため、特に初学者にとっては混乱しやすいテーマでもあります。しかし、SPA(Single Page Application)を開発する上では、ルーティングは避けては通れないテーマです。一通りの理屈を理解した後は、配布サンプルをもとにページを拡張したり、パスを変えてみたりと手を動かしながら、理解を深めてみることをお勧めします。

 次回は、ビュー開発をより便利にするフィルター集、Angular Filterについて解説の予定です。

参考資料

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

  • X ポスト
  • このエントリーをはてなブックマークに追加
AngularJSアプリ開発を支援する便利モジュール連載記事一覧

もっと読む

この記事の著者

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

静岡県榛原町生まれ。一橋大学経済学部卒業後、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編 」他、著書多数

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

WINGSプロジェクト(ウイングスプロジェクト)

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

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

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

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/9012 2015/10/19 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング