AngularJS フィルターと AngularJS カスタム フィルターと例
⚡ スマートサマリー
AngularJS のフィルターは、基となるデータを変更することなく、式の値を表示用にフォーマットします。組み込みのフィルターは、大文字小文字、数値、通貨、JSON に対応しており、カスタムフィルターはフレームワークが提供していないあらゆるフォーマットルールを処理できます。

AngularJSのフィルターとは何ですか?
A AngularJS でのフィルター この機能を使うと、式の値を変更せずに、ユーザーに表示するための書式を整えることができます。例えば、文字列を小文字または大文字で表示したい場合は、フィルターを使用できます。組み込みのフィルター「lowercase」や「uppercase」は、指定されたケースで文字列を返します。さらに、数値、通貨、JSON 用のフィルターも用意されています。
⚠️ バージョンノート: AngularJS(1.x ブランチ)は 2021 年 12 月 31 日にサポートが終了し、セキュリティ パッチは提供されなくなりました。以下の内容は、既存の AngularJS アプリケーションの保守には引き続き有効ですが、最新の Angular では、同じ役割はパイプによって担われています。
ビューでは、パイプ記号を使ってフィルターを適用します。それぞれのフィルターを見る前に、なぜ自分でフィルターを作成する必要があるのかを理解しておきましょう。
AngularJS の小文字フィルター
このフィルターは文字列を受け取り、その中のすべての文字を小文字で表示します。
以下では、コントローラがスコープオブジェクトを介して文字列をビューに送信し、フィルタがそれを小文字に変換します。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Event Registration</title> </head> <body> <h1> Guru99 Global Event</h1> <script src="https://code.angularjs.org/1.6.9/angular.min.js"></script> <div ng-app="DemoApp" ng-controller="DemoController"> Tutorial Name : <input type="text" ng-model="tutorialName"><br> This tutorial is {{tutorialName | lowercase}} </div> <script> var app = angular.module('DemoApp', []); app.controller('DemoController', ['$scope', function($scope) { $scope.tutorialName = "Angular JS"; }]); </script> </body> </html>
Code 説明
- 大文字と小文字が混在した文字列「Angular JS」は、メンバー変数に格納されます。
tutorialNameスコープオブジェクト上。 - フィルタ記号(|)は変換対象の出力を示し、
lowercaseキーワードは、文字列全体を小文字に変換する組み込みフィルターを適用します。
⚠️ すべての掲載情報に修正が適用されました。 オリジナルの6つの例すべてに、3つの共通の欠陥があった。 chrset="UTF 8" は有効な属性またはエンコーディングではないため、現在は charset="UTF-8". angular-route.js ロードされました angular.min.jsこれはモジュールエラーを発生させ、実際には使用されていなかったため、削除されました。未使用のjQuery参照も同様に削除されています。また、テキストでは値が「AngularJS」と記載されていましたが、コードでは「Angular JS」に設定されていました。現在はテキストが一致しています。
出力:
大文字と小文字が混在する文字列は、すべて小文字で表示されます。逆の変換も同様に機能します。
AngularJS の大文字フィルター
このフィルターは小文字フィルターの対となるもので、すべての文字を大文字で表示します。
以下では、コントローラがスコープオブジェクトを介して文字列をビューに送信し、フィルタがそれを大文字に変換します。
<!-- The head and library references are unchanged from the previous example --> <div ng-app="DemoApp" ng-controller="DemoController"> Tutorial Name : <input type="text" ng-model="tutorialName"><br> This tutorial is {{tutorialName | uppercase}} </div> <script> app.controller('DemoController', ['$scope', function($scope) { $scope.tutorialName = "Angular JS"; }]); </script>
Code 説明
- 大文字と小文字が混在した文字列「Angular JS」は、
tutorialNameそしてスコープオブジェクトにアタッチされます。 - フィルタ記号(|)の後には
uppercaseキーワードなので、組み込みのフィルターは文字列全体を大文字でレンダリングします。
⚠️ 訂正: 元の記事ではこのセクションを「小文字オプション付きのAngularJS大文字化フィルターの例」と紹介していましたが、これは二重に誤りです。このセクションでは大文字化フィルターを解説しており、AngularJSにはそもそも大文字化フィルターは存在しません。最初の文字だけを大文字にするにはカスタムフィルターが必要で、その作成方法は後のセクションで説明します。
出力:
大文字小文字を区別するフィルターは引数を取りません。次のフィルターは、コロンを使ってパラメーターをフィルターに渡す方法を示しています。
AngularJS の数値フィルター
このフィルターは数値の書式を設定し、表示される小数点以下の桁数を制限できます。
以下の例では、数値フィルターを使用して、小数点以下2桁に制限された値を表示します。コントローラーはスコープオブジェクトを介して数値をビューに送信し、ビューでフィルターが適用されます。
<!-- The head and library references are unchanged --> <div ng-app="DemoApp" ng-controller="DemoController"> This tutorialID is {{tutorialID | number:2}} </div> <script> app.controller('DemoController', ['$scope', function($scope) { $scope.tutorialID = 3.565656; }]); </script>
Code 説明
- 小数点以下の桁数が多い数値は、メンバー変数に格納されます。
tutorialIDそしてスコープオブジェクトにアタッチされます。 - フィルタ記号(|)の後には
number:2コロンは引数を渡し、2は小数点以下2桁を指定します。表示時には値が丸められるため、3.565656は3.57と表示されますが、スコープ内では元の数値が保持されます。
出力:
数値が金額を表す場合、単に数値をフォーマットするだけでは不十分な場合が多く、次のフィルターはそのような場合に対応します。
AngularJS の通貨フィルター
このフィルターは、数値を通貨値としてフォーマットし、$ などの通貨記号を接頭辞として追加します。
以下の例では、コントローラがスコープオブジェクトを介してビューに数値を送信し、ビューで通貨フィルタが適用されます。
<!-- The head and library references are unchanged --> <div ng-app="DemoApp" ng-controller="DemoController"> This tutorial Price is {{tutorialprice | currency}} </div> <script> app.controller('DemoController', ['$scope', function($scope) { $scope.tutorialprice = 20.56; }]); </script>
Code 説明
- 数値は、メンバー変数に格納されます。
tutorialpriceそしてスコープオブジェクトにアタッチされます。 - フィルタ記号(|)の後には
currencyフィルタ。
⚠️ 訂正: 元の記述では、通貨は「マシンに適用されている言語設定に依存する」とされていましたが、そうではありません。AngularJS はライブラリにバンドルされているロケール (デフォルトでは en-US) を使用するため、オペレーティングシステムに関係なく記号は $ になります。 angular-locale_*.js ファイルを指定するか、シンボルを直接渡す: {{tutorialprice | currency:"£"}}.
出力:
文字列と数値は単純な値です。最後の組み込みフィルタは、オブジェクト全体を扱います。
AngularJS の JSON フィルター
このフィルターはオブジェクトをフォーマットされた形式に変換します JSONの これは、開発中にスコープデータを検査する際に役立ちます。
以下の例では、コントローラーがスコープオブジェクトを介してビューにオブジェクトを送信し、ビューでJSONフィルターが適用されます。
<!-- The head and library references are unchanged --> <div ng-app="DemoApp" ng-controller="DemoController"> This tutorial is {{tutorial | json}} </div> <script> app.controller('DemoController', ['$scope', function($scope) { $scope.tutorial = { TutorialID: 12, tutorialName: "Angular" }; }]); </script>
Code 説明
- 物体を保持する
TutorialID: 12(NAIST) とtutorialName: "Angular"というメンバ変数に格納されますtutorialそしてスコープオブジェクトにアタッチされます。 - フィルタ記号(|)の後には
jsonオブジェクトをインデントされたJSONテキストにシリアル化するフィルター。
⚠️ 訂正: 元の記述ではこの値を「数値」および「JSON 型の文字列」と表現していましたが、どちらでもありません。 Javaスクリプトオブジェクトと、それを表示用のJSON文字列に変換するJSONフィルターです。
出力:
これら5つのフィルターは一般的なケースを網羅しています。これらのフィルターで必要な出力が得られない場合は、独自のフィルターを作成してください。
AngularJS カスタム フィルター
AngularJSに組み込まれているフィルターでは、出力フォーマットの要件を満たせない場合があります。そのような場合は、必要な形式で出力を返すAngularJSカスタムフィルターを作成できます。
カスタムフィルタはモジュールに登録され、組み込みフィルタとまったく同じように動作します。カスタムフィルタも同じパイプ構文を使用するため、以下のセクションではまず標準フィルタについて説明し、次にカスタムフィルタの作成方法を示します。
AngularJS でカスタム フィルターを作成する方法
以下の例では、文字列が渡されます。 コントローラ スコープ オブジェクトを介してビューに渡されますが、そのまま表示されるべきではありません。 AngularJS 別の文字列を追加し、完成した結果を表示します。
<!-- The head and library references are unchanged --> <div ng-app="DemoApp" ng-controller="DemoController"> This tutorial is {{tutorial | Demofilter}} </div> <script> var app = angular.module('DemoApp', []); // The factory runs once; the function it returns runs on every value app.filter('Demofilter', function() { return function(input) { return input + " Tutorial"; }; }); app.controller('DemoController', ['$scope', function($scope) { $scope.tutorial = "Angular"; }]); </script>
Code 説明
- 文字列「Angular」は、メンバー変数に格納されます。
tutorialそしてスコープオブジェクトにアタッチされます。 - AngularJSは
filterカスタムフィルターを作成するために使用される登録方法。「Demofilter」はそのフィルターに付けられた名前であり、ビューはこの名前を参照します。 - これはカスタムフィルターの標準的な形状です。登録された関数は 工場 処理を実行する関数を返します。この関数は、フィルタリング対象の値を最初の引数として受け取り、結果を返します。ここでは、「Tutorial」が付加された入力値を返します。
- このフィルターは、組み込みフィルターと同様のパイプ構文を使用してビューに適用されます。
💡 ヒント: フィルター名は慣例として小文字またはキャメルケースです。「Demofilter」は機能しますが、次のような名前は appendTutorial 読みやすく、組み込みの名前との衝突も避けられます。
出力:
渡された文字列に「Tutorial」という単語が追加されました。 tutorial 変数。このフィルターは常に同じテキストを追加しますが、次のセクションでそのテキストを設定できます。
カスタムフィルターに引数を渡す方法
上記のフィルターは追加するテキストをハードコーディングするため、1つのことしかできません。組み込みフィルターなど number:2 コロンの後に続く引数を受け入れることができ、カスタムフィルターも同様です。最初のパラメーター以降のすべてのパラメーターは、ビュー内のコロンで区切られた引数にマッピングされます。
3つのステップがあります: パラメータを追加 input 返される関数では、オプションの引数にはデフォルト値を指定して、引数が省略された場合でもフィルタが機能するようにし、ビュー内の引数をコロンで区切って渡します。
app.filter('appendText', function() { return function(input, suffix, separator) { if (!input) { return input; } // guard against undefined separator = typeof separator === 'undefined' ? ' ' : separator; return input + separator + suffix; }; });
すると、画面には「チュートリアル」が次のように表示されます。 suffix そしてハイフンは separator.
{{tutorial | appendText:"Tutorial"}} // Angular Tutorial
{{tutorial | appendText:"Tutorial":" - "}} // Angular - Tutorial
見落としやすい点が2つあります。引数はAngularJSの式なので、リテラル文字列は引用符で囲む必要がありますが、引用符で囲まれていない単語はスコーププロパティとして読み込まれます。また、フィルターは連鎖しており、それぞれが前のフィルターの出力を受け取ります。 {{tutorial | appendText:"Tutorial" | uppercase}}.
⚠️ 警告: フィルターは純粋に保つ必要があります。つまり、同じ入力に対して同じ出力が得られ、外部からの変更はありません。AngularJS は純粋なフィルターをキャッシュし、入力が変更された場合にのみ再実行します。クロックを読み取ったり、サービスを変更したりするフィルターは、マークする必要があります。 $statefulこれはキャッシュを無効にし、ダイジェストサイクルごとにフィルタを実行するため、ページの表示が遅くなる一般的な原因となります。
フィルターはテンプレートに限定されません。同じフィルターを以下の場所から呼び出すことができます。 Javaスクリプトは次の図のとおりです。
コントローラーで$filterサービスを使用してフィルターを使用する方法
ビューでフィルターを適用するのが一般的ですが、変換された値はコントローラー内で必要になる場合もあります。たとえば、サーバーにデータを送信する前などです。AngularJS は、組み込みフィルターとカスタムフィルターの両方を含む、登録されたすべてのフィルターを次のように公開します。 $filter サービスに注入し、フィルタ名を指定して呼び出してフィルタ関数を取得し、その関数を値と引数を指定して呼び出します。
app.controller('DemoController', ['$scope', '$filter', function($scope, $filter) { $scope.tutorial = "Angular"; // Built-in filters, called from JavaScript $scope.shouted = $filter('uppercase')($scope.tutorial); // "ANGULAR" $scope.price = $filter('currency')(20.56); // "$20.56" // A custom filter works exactly the same way $scope.full = $filter('appendText')($scope.tutorial, "Tutorial"); }]);
より短い形式も存在します。フィルター名に続いて Filter、 といった uppercaseFilterはフィルター関数を直接提供し、すぐに呼び出すことができます。どちらの形式も同じ関数に解決されるため、選択はスタイルの問題です。
2 つの用途が繰り返し出てきます。1 つ目はペイロードの準備です。日付は通常、固定パターンで API に到達する必要があり、 $filter('date')(value, 'yyyy-MM-dd') フォームにバインドされた値に触れることなく生成します。2つ目は、コントローラー内でコレクションを絞り込むことです。 orderBy で NGリピート ダイジェストごとに再実行される式。
このように注入されたフィルターはモジュールに登録されたままなので、カスタムフィルターは次のように宣言する必要があります。 app.filter 管制官が質問する前に $filter そうしないと、AngularJS は不明なプロバイダーエラーをスローします。
フィルターを呼び出す Javaスクリプトはテンプレートと重要な点で異なります。それは、結果が一度計算されてスコープに保存され、ダイジェストごとに再計算されないことです。そのため、めったに変更されない値には高速なオプションとなりますが、頻繁に変更される値には適していません。 track ユーザー入力。












