AngularJSフィルター


AngularJSにフィルターを追加して、データをフォーマットできます。


AngularJSフィルター

AngularJSは、データを変換するためのフィルターを提供します。

  • currency数値を通貨形式にフォーマットします。
  • date日付を指定された形式にフォーマットします。
  • filter配列からアイテムのサブセットを選択します。
  • jsonオブジェクトをJSON文字列にフォーマットします。
  • limitTo配列/文字列を指定された数の要素/文字に制限します。
  • lowercase文字列を小文字にフォーマットします。
  • number数値を文字列にフォーマットします。
  • orderBy式によって配列を順序付けます。
  • uppercase文字列を大文字にフォーマットします。

式へのフィルターの追加

パイプ文字|の後にフィルターを使用することにより、フィルターを式に追加できます。

フィルターはuppercase文字列を大文字にフォーマットします:

<div ng-app="myApp" ng-controller="personCtrl">

<p>The name is {{ lastName | uppercase }}</p>

</div>

フィルターはlowercase文字列を小文字にフォーマットします:

<div ng-app="myApp" ng-controller="personCtrl">

<p>The name is {{ lastName | lowercase }}</p>

</div>


ディレクティブへのフィルターの追加

ng-repeatフィルタは、パイプ文字を使用して 、のようにディレクティブに追加され|、その後にフィルタが続きます。

orderByフィルタは配列を並べ替えます

<div ng-app="myApp" ng-controller="namesCtrl">

<ul>
  <li ng-repeat="x in names | orderBy:'country'">
    {{ x.name + ', ' + x.country }}
  </li>
</ul>

</div>

通貨フィルター

currencyフィルタは、数値を通貨としてフォーマットします

<div ng-app="myApp" ng-controller="costCtrl">

<h1>Price: {{ price | currency }}</h1>

</div>

通貨フィルターの詳細については、AngularJS通貨フィルターリファレンスをご覧ください。


フィルターフィルター

filterフィルタは、配列のサブセットを選択します

フィルタはfilter配列でのみ使用でき、一致する項目のみを含む配列を返します。

文字「i」を含む名前を返します。

<div ng-app="myApp" ng-controller="namesCtrl">

<ul>
  <li ng-repeat="x in names | filter : 'i'">
    {{ x }}
  </li>
</ul>

</div>

AngularJSフィルターフィルターリファレンスでフィルターフィルターの詳細を読む


ユーザー入力に基づいて配列をフィルタリングする

入力フィールドにディレクティブを設定することによりng-model、入力フィールドの値をフィルターの式として使用できます。

入力フィールドに文字を入力すると、一致に応じてリストが縮小/拡大します。

  • ジャニ
  • カール
  • マーガレス
  • ヘゲ
  • ジョー
  • グスタフ
  • ビルギット
  • メアリー
  • カイ

<div ng-app="myApp" ng-controller="namesCtrl">

<p><input type="text" ng-model="test"></p>

<ul>
  <li ng-repeat="x in names | filter : test">
    {{ x }}
  </li>
</ul>

</div>

ユーザー入力に基づいて配列を並べ替える

ソート順を変更するには、テーブルヘッダーをクリックします::

名前
ジャニ ノルウェー
カール スウェーデン
マーガレス イングランド
ヘゲ ノルウェー
ジョー デンマーク
グスタフ スウェーデン
ビルギット デンマーク
メアリー イングランド
カイ ノルウェー

テーブルヘッダーにディレクティブを追加することng-clickで、配列の並べ替え順序を変更する関数を実行できます。

<div ng-app="myApp" ng-controller="namesCtrl">

<table border="1" width="100%">
  <tr>
    <th ng-click="orderByMe('name')">Name</th>
    <th ng-click="orderByMe('country')">Country</th>
  </tr>
  <tr ng-repeat="x in names | orderBy:myOrderBy">
    <td>{{x.name}}</td>
    <td>{{x.country}}</td>
  </tr>
</table>

</div>

<script>
angular.module('myApp', []).controller('namesCtrl', function($scope) {
  $scope.names = [
    {name:'Jani',country:'Norway'},
    {name:'Carl',country:'Sweden'},
    {name:'Margareth',country:'England'},
    {name:'Hege',country:'Norway'},
    {name:'Joe',country:'Denmark'},
    {name:'Gustav',country:'Sweden'},
    {name:'Birgit',country:'Denmark'},
    {name:'Mary',country:'England'},
    {name:'Kai',country:'Norway'}
  ];
  $scope.orderByMe = function(x) {
    $scope.myOrderBy = x;
  }
});
</script>

カスタムフィルター

モジュールに新しいフィルターファクトリ関数を登録することにより、独自のフィルターを作成できます。

「myFormat」というカスタムフィルターを作成します。

<ul ng-app="myApp" ng-controller="namesCtrl">
  <li ng-repeat="x in names">
    {{x | myFormat}}
  </li>
</ul>

<script>
var app = angular.module('myApp', []);
app.filter('myFormat', function() {
  return function(x) {
    var i, c, txt = "";
    for (i = 0; i < x.length; i++) {
      c = x[i];
      if (i % 2 == 0) {
        c = c.toUpperCase();
      }
      txt += c;
    }
    return txt;
  };
});
app.controller('namesCtrl', function($scope) {
  $scope.names = ['Jani', 'Carl', 'Margareth', 'Hege', 'Joe', 'Gustav', 'Birgit', 'Mary', 'Kai'];
});
</script>

フィルタは、myFormat1文字おきに大文字にフォーマットします。