SHOEISHA iD

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

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

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

AngularJSアプリでソート/ページングやフィルター機能付きの高機能グリッド表を実装する(UI Grid)

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

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

ページング機能を実装する

 ページング機能を有効にするには、テンプレート/コントローラー双方の修正が必要となります。

リスト5 ページングを有効にする例(grid_paging.html)
<div ui-grid="myGrid" ui-grid-pagination></div>
リスト6 ページングを有効にする例(grid_paging.html)
angular.module('myApp', [ 'ui.grid', 'ui.grid.pagination' ])
  .controller('MyController', ['$scope', 'uiGridConstants', function($scope, uiGridConstants) {
    $scope.myGrid = {
      enablePaginationControls: true,
      paginationPageSize: 5,
      paginationPageSizes: [3, 5, 7 ],
      ...中略...
    };
  }]);

 ページングを有効にするには、現在のモジュールから(ui.gridに加えて)ui.grid.paginationモジュールへの依存関係を設定した上で、グリッド要素(<div>要素)に対してui-grid-pagination属性を付与します。また、コントローラー側では、以下のようなグローバルパラメーターを設定してください。

ページング関連の主なパラメーター
パラメーター 概要
enablePaginationControls ページングのためのコントローラー(ページャー)を表示
paginationPageSize デフォルトのページサイズ
paginationPageSizes 選択できるページサイズの候補(配列)

 この例であれば、3、5、7件から選択できるページャーを表示します。paginationPageSizeパラメーターには、paginationPageSizesパラメーターにない値を指定してもエラーにはなりませんが、アプリとしては不自然です。まずは、候補内からデフォルト値を選択すべきでしょう。

 グリッド表の下部に、以下のようなページャーが表示されること、ページャーでページを移動できることを確認してください。

自動生成されたページャーを表示
自動生成されたページャーを表示

カスタムのページャーを準備する

 ページャーは自前で準備することもできます。たとえば以下は、グリッド表の下部に独自の前後ボタンと、指定ページへの移動ボタンを付与する例です。

リスト7 グリッド表にカスタムページャーを実装する例(grid_custom.html)
<div ui-grid="myGrid" ui-grid-pagination></div>
<div>{{api.getPage()}}/{{api.getTotalPages()}}</div>
<button type="button" ng-click="api.previousPage()">
  前ページへ</button>
<button type="button" ng-click="api.nextPage()">
  次ページへ</button>
|
<input type="number" ng-model="pagenum" size="3" />
 <button type="button" ng-click="api.seek(pagenum)">
  指定されたページへ</button>
リスト8 グリッド表にカスタムページャーを実装する例(grid_custom.js)
angular.module('myApp', [ 'ui.grid', 'ui.grid.pagination' ])
  .controller('MyController', ['$scope', 'uiGridConstants', function($scope, uiGridConstants) {
    $scope.pagenum = 1;
    $scope.myGrid = {
      enablePaginationControls: false,
      paginationPageSize: 5,
      onRegisterApi: function(gridApi){
        $scope.api = gridApi.pagination;
      },
      ...中略...
    };
  }]);
カスタムページャーを表示
カスタムページャーを表示

 onRegisterApiパラメーターには、グリッド表が初期化されたタイミングで呼び出されるコールバック関数を登録します。引数にUI Grid API(gridApi)が渡されますので、そのpaginationオブジェクトを、あとからテンプレートで利用できるよう、スコープ変数に登録しておきます。paginationオブジェクトは、ページング関連の操作に関わる機能を提供します。

 あとは、テンプレート側に配置したボタンからpaginationオブジェクトのメソッドを呼び出すだけです。ここで利用しているのは、以下のメンバーです。

ページング関連のメンバー
メソッド 概要
getPage() 現在のページ数を取得
getTotalPages() 総ページ数を取得
nextPage() 次のページに移動
previousPage() 前のページに移動
seek(page) 指定されたページ(page)に移動

フィルター機能を実装する

 フィルター機能を有効にすることで、列単位にキーワード一致(部分一致)したデータのみを検索できます。

リスト9 フィルター機能を有効にした例(grid_filter.js)
angular.module('myApp', [ 'ui.grid'])
  .controller('MyController', ['$scope', 'uiGridConstants', function($scope, uiGridConstants) {
    $scope.myGrid = {
      enableFiltering: true,
      columnDefs: [
        {
          field: 'cid',
          displayName: '商品コード',
          cellClass: 'strong',
          enableHiding: false
        },
        {
          field: 'name',
          displayName: '商品名',
          filter: {
            condition: uiGridConstants.filter.STARTS_WITH,
            placeholder: '前方一致'
          }
        },
        {
          field: 'price',
          displayName: '価格',
          cellFilter: 'currency : "¥" :0',
          filters: [
            {
              condition: uiGridConstants.filter.GREATER_THAN_OR_EQUAL,
              placeholder: '以上'
            },
            {
              condition: uiGridConstants.filter.LESS_THAN_OR_EQUAL,
              placeholder: '以下'
            }
          ]
        },
        {
          field: 'from',
          displayName: '産地'
        },
        {
          field: 'ship',
          displayName: '出荷日',
          cellFilter: 'date: "yyyy年MM月dd日"',
          enableFiltering: false
        }
      ],
      ...中略...
    };
  }]);
入力したキーワードで絞り込み表示
入力したキーワードで絞り込み表示

 フィルター機能を実装するには、グローバルパラメーターとしてenableFilteringパラメーターをtrueに設定した上で、columnDefs-filterパラメーターから列単位の挙動を設定します。filterパラメーター配下で利用できるパラメーター情報には、以下のようなものがあります。

フィルター関連のパラメーター
パラメーター 概要
placeholder テキストボックスに表示する透かし文字
term 初期値
condition 比較条件(設定値は以下の表を参照)
conditionパラメーターの設定値
設定値 概要
CONTAINS 部分一致
EXACT 完全一致
STARTS_WITH 前方一致
ENDS_WITH 後方一致
GREATER_THAN_OR_EQUAL 以上
LESS_THAN_OR_EQUAL 以下
GREATER_THAN より大きい
LESS_THAN 未満
NOT_EQUAL 等しくない

 検索条件を表す定数値は、uiGridConstantsサービスで提供されています。あらかじめコントローラー側で注入しておくのを忘れないようにしてください。

 filters(複数形)パラメーターに配列を指定することで、複数の検索ボックスを設置することもできます。この場合、検索条件はand条件となります。

次のページ
データの編集機能を実装する

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

  • 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 X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

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

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

この記事をシェア

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

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング