AngularJSのフィルターは、HTML内だけではなく、スクリプト内のコントローラ、サービス、ディレクティブ、カスタムフィルター内でも使用する事が出来ます。
デモとコードサンプルはこちら。
※目次をクリックすると目次の下部にコンテンツが表示されます。
スクリプト内でフィルターを使用する方法
1)方法1
$filter(フィルター名)の書式を使ってスクリプト内で利用する事が出来ます。
この場合、下記のように依存性指定の引数に$filterを指定する必要があります。
下記例では、ビルトインの”filter”フィルターを使用し、入力のproducts配列に対し、name属性に”パソコン”が含まれるデータを抽出してリターンしています。
$filter(フィルター名)の書式を使ってスクリプト内で利用する事が出来ます。
この場合、下記のように依存性指定の引数に$filterを指定する必要があります。
下記例では、ビルトインの”filter”フィルターを使用し、入力のproducts配列に対し、name属性に”パソコン”が含まれるデータを抽出してリターンしています。
demoApp.controller("filterCtrl", function($scope,$filter) { $scope.products = [ {no: 1,name: "デジタルカメラA",price: 8500,chk:true}, {no: 2,name: "デジタルカメラD",price: 3500,chk:false}, {no: 3,name: "パソコンB",price: 15900,chk:true}, {no: 4,name: "デジタルカメラB",price: 9800,chk:true}, {no: 5,name: "パソコンD",price: 5900,chk:false}, {no: 6,name: "パソコンC",price: 25900,chk:true}, {no: 7,name: "パソコンA",price: 14900,chk:true} ]; $scope.pcProducts = $filter("filter")($scope.products, {name: 'パソコン'}); })
2)方法2
フィルター名Filterという書式を使って利用する事も出来ます。ビルトインのnumberやcurrencyフィルターを使う場合は、numberFilter、currencyFilterになります。
方法1と同様に依存性指定の引数に指定する必要があります。
下記例では、ビルトインの”filter”フィルターを使用し、入力のproducts配列に対し、chk属性がtrueのデータを抽出してリターンしています。
demoApp.controller("filterCtrl", function($scope,filterFilter) { $scope.products = [ {no: 1,name: "デジタルカメラA",price: 8500,chk:true}, {no: 2,name: "デジタルカメラD",price: 3500,chk:false}, {no: 3,name: "パソコンB",price: 15900,chk:true}, {no: 4,name: "デジタルカメラB",price: 9800,chk:true}, {no: 5,name: "パソコンD",price: 5900,chk:false}, {no: 6,name: "パソコンC",price: 25900,chk:true}, {no: 7,name: "パソコンA",price: 14900,chk:true} ]; $scope.trueProducts = filterFilter($scope.products, {chk: 'true'}); })
既存のフィルターを拡張する例
カスタムフィルター内で既存のフィルターを使用し、拡張する事が出来ます。
下記例では、ビルトインの”limitTo”フィルターと定義済みのカスタムフィルター”offset”を使って、”range”というカスタムフィルターを定義しています。
入力配列データからオフセットと個数を指定して、指定した範囲のデータを抽出しています。
下記例では、ビルトインの”limitTo”フィルターと定義済みのカスタムフィルター”offset”を使って、”range”というカスタムフィルターを定義しています。
入力配列データからオフセットと個数を指定して、指定した範囲のデータを抽出しています。
(スクリプト) demoApp.filter('range', function($filter) { return function (input, offset, count) { var offsetInput = $filter("offset")(input, offset); return $filter("limitTo")(offsetInput, count); } }) (HTML) <tr ng-repeat="item in products | range:i_offset:i_size">