SHOEISHA iD

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

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

最先端テクノロジーに対応した高速・軽量なJavaScript UIライブラリ「Wijmo」の活用(AD)

「Wijmo(ウィジモ) 5」が提供する万能グリッド部品FlexGrid

ECMAScript 5に準拠した高速・軽量なJavaScript UIライブラリ「Wijmo 5」の活用 第3回

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

ICollectionViewインターフェースでページングやフィルタを実現

 FlexGridはページングやフィルタなどのデータ操作を行う機能を備えます。以下では、データ操作のために提供されているICollectionViewインターフェースとその実装CollectionViewクラスの利用法を説明します。

 FlexGridでデータ操作を行うためには、FlexGridに与えるデータを直接指定する代わりに、リスト5のようにデータ変数を引数に与えて生成したCollectionViewクラスのインスタンスを指定します。このように指定することで、ICollectionViewインターフェースが提供するデータ操作を行えるようになります。

リスト5 CollectionViewインスタンスの生成
// データを引数に与えてCollectionViewインスタンスを生成
$scope.gridData = new wijmo.collections.CollectionView(gridData);
// gridDataはそのままFlexGridのitems-sourceに指定可能

 ICollectionViewインターフェース(CollectionViewクラス)のAPIを利用したデータ操作例を以下でいくつか紹介します。

データ操作例1:ページング

 ページングを実現するためには、リスト6のようにpageSizeプロパティに1ページあたりのデータ数を指定します。

リスト6 ページングの実装(004_wijmo_flexgrid4.html)
// データを引数に与えてCollectionViewインスタンスを生成
$scope.gridData = new wijmo.collections.CollectionView(gridData);
// ページング指定
$scope.gridData.pageSize = 3;

 現在ページや全ページ数の表示、ページ移動のためには表3のメソッド・プロパティを利用します。

表3 ページング関連メソッド・プロパティ
名称 内容
moveToFirstPage() 先頭ページに移動するメソッド
moveToPreviousPage() 1ページ前に移動するメソッド
moveToNextPage() 1ページ後に移動するメソッド
moveToLastPage() 最終ページに移動するメソッド
pageIndex 現在ページを表すプロパティ(先頭ページが0になる)
pageCount 全ページ数を表すプロパティ

 ページ操作・表示の実装例をリスト7に示します。

リスト7 ページ操作・表示ボタンの実装(004_wijmo_flexgrid4.html)
<button ng-click="gridData.moveToFirstPage()">先頭</button>
<button ng-click="gridData.moveToPreviousPage()">前</button>
{{gridData.pageIndex + 1 | number}} / {{gridData.pageCount | number}}
<button ng-click="gridData.moveToNextPage()">次</button>
<button ng-click="gridData.moveToLastPage()">最後</button>

 リスト6、7を実行すると、データが3行ごとにページングされます。

図5 ページング処理を実現(004_wijmo_flexgrid4.html)
図5 ページング処理を実現(004_wijmo_flexgrid4.html)

データ操作例2:フィルタ

 フィルタを実現するためには、filterメソッドにフィルタ処理を実装します。検索ワードでフィルタ処理を行う実装例をリスト8に示します。

リスト8 フィルタの実装(005_wijmo_flexgrid5.html)
// フィルタ値変数 ...(1)
$scope.filterValue = "";

// データを引数に与えてCollectionViewインスタンスを生成 ...(2)
$scope.gridData = new wijmo.collections.CollectionView(gridData);

// フィルタ処理を実装 ...(3)
$scope.gridData.filter = function(item) {
    // フィルタ未指定のときは無条件true
    if (!$scope.filterValue) {
        return true;
    }
    // フィルタ指定されているときはname属性とマッチング
    else {
        return item.name.indexOf($scope.filterValue) > -1;
    }
};

// フィルタ変数(filterValue)が変更された時の処理 ...(4)
var filterDescriptor;
$scope.$watch('filterValue', function () {
    // timeout実行中の場合はいったん解除
    if (filterDescriptor) {
        $timeout.cancel(filterDescriptor);
    }
    // 一定時間遅延後フィルタ適用 ...(5)
    filterDescriptor = $timeout(function () {
        $scope.gridData.refresh();
    }, 1000);
});

 (1)は画面で入力された検索ワードが格納される変数です。(2)でデータからCollectionViewインスタンスを生成し、(3)でCollectionViewのフィルタ処理を実装します。フィルタ処理は「フィルタに合致した時にtrue、合致しない時にfalse」を返すようにします。ここではフィルタ値とデータのname属性を比較して部分一致した時にtrueを返しています。(4)ではフィルタの変数が変更された時に(検索ワードの入力とフィルタ適用処理が競合しないよう)一定の遅延時間後にフィルタを適用する(5)のrefreshメソッドを実行しています。遅延の処理にはAngularJSが提供する$timeoutを使用しています。

 リスト8を実行すると、入力したフィルタ値と部分一致した製品名のデータだけがリストされるようになります。

図6 製品名に対するフィルタ処理を実現(005_wijmo_flexgrid5.html)
図6 製品名に対するフィルタ処理を実現(005_wijmo_flexgrid5.html)

データ操作例3:グループ化

 グループ化を実現するためには、groupDescriptionsプロパティにグループ化の情報を表すGroupDescriptionクラスのインスタンスを指定します。実装例をリスト9に示します。

リスト9 グループ化の実装(006_wijmo_flexgrid6.html)
// グループを表す変数 ...(1)
$scope.groupValue = "";

// データを引数に与えてCollectionViewインスタンスを生成 ...(2)
$scope.gridData = new wijmo.collections.CollectionView(gridData);

// グループ(group)が変更された時の処理 ...(3)
var filterDescriptor;
$scope.$watch('groupValue', function () {
    // 現在のgroupDescriptionsをクリア ...(4)
    $scope.gridData.groupDescriptions.clear();
    if ($scope.groupValue.length > 0) {
        // グループ名を取得してgroupDescriptionsに設定 ...(5)
        var groupNames = $scope.groupValue.split(',');
        angular.forEach(groupNames, function(groupName, i) {
            var groupDesc = new wijmo.collections.PropertyGroupDescription(groupName);
            $scope.gridData.groupDescriptions.push(groupDesc);
        });
    }
});

 (1)は選択されたグループの値に対応する変数で、データの列名(「name」「version」など)が格納されます。(2)でデータからCollectionViewインスタンスを生成し、(3)でグループの変数が変更された時にgroupDescriptionsを更新してグループ表示を適用しています。まず(4)ですでに適用されたgroupDescriptionsをクリアし、(5)ではカンマ区切りで指定されたグループ名のそれぞれからグループを指定しています。ここでPropertyGroupDescriptionはGroupDescriptionクラスの子クラスで、グループ名(データの列名)でグループを指定できます。なおループ処理にはAngularJSが提供するangular.forEachメソッドを使用しています。

 リスト9を実行すると、指定されたデータ列でデータをグループ表示できます。

図7 メーカーとOSでグループ表示(006_wijmo_flexgrid6.html)
図7 メーカーとOSでグループ表示(006_wijmo_flexgrid6.html)

まとめ

 本記事では、グレープシティのJavaScriptライブラリ「Wijmo 5」が提供するグリッド部品「FlexGrid」について、機能や使用法をサンプルコードとともに紹介しました。FlexGridのAPIや、ICollectionViewインターフェースによるデータ操作の仕組みは、従来より提供されている.NET版のFlexGridを下敷きにしているため、.NET版の利用経験を生かして開発が可能です。経験がない利用者にとっても、.NET版で実績のあるAPIを用いてHTML/JavaScript環境でグリッド部品を利用できるメリットがあります。

 次回記事ではチャートやゲージ、入力部品など、Wijmo 5が備えるFlexGrid以外のJavaScriptコントロールについて説明します。

参考資料

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

  • このエントリーをはてなブックマークに追加
最先端テクノロジーに対応した高速・軽量なJavaScript UIライブラリ「Wijmo」の活用連載記事一覧

もっと読む

この記事の著者

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

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

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

【AD】本記事の内容は記事掲載開始時点のものです 企画・制作 株式会社翔泳社

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

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/8595 2015/11/10 15:30

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング