Фильтры AngularJS и пользовательский фильтр AngularJS с примером
⚡ Умное резюме
Фильтр в AngularJS форматирует значение выражения для отображения без изменения исходных данных. Встроенные фильтры охватывают регистр символов, числа, валюту и JSON, а пользовательский фильтр обрабатывает любые правила форматирования, которые фреймворк еще не предоставляет.

Что такое фильтр в AngularJS?
A Фильтр в AngularJS Это помогает форматировать значение выражения для отображения пользователю без изменения исходного значения. Например, если вы хотите, чтобы строка отображалась либо в нижнем, либо в верхнем регистре, вы можете сделать это с помощью фильтров. Встроенные фильтры, такие как «нижний регистр» и «верхний регистр», возвращают строку в запрошенном регистре, а также существуют дополнительные фильтры для чисел, валюты и JSON.
⚠️ Примечание к версии: Поддержка AngularJS (ветка 1.x) завершилась 31 декабря 2021 года, и дальнейшие обновления безопасности не выпускаются. Вся приведенная ниже информация остается актуальной для поддержки существующих приложений AngularJS; в современном Angular ту же роль выполняет пайп.
Фильтры применяются в представлении с использованием символа вертикальной черты (|). Прежде чем рассматривать каждый из них, полезно понять, зачем вы пишете свой собственный фильтр.
Фильтр строчных букв в AngularJS
Этот фильтр принимает строку и отображает все её символы в нижнем регистре.
Ниже контроллер отправляет строку в представление через объект scope, а фильтр преобразует её в нижний регистр.
<!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Ключевое слово применяет встроенный фильтр, который преобразует всю строку в нижний регистр.
⚠️ В каждое объявление внесены исправления. Все шесть исходных образцов имели три общих дефекта. chrset="UTF 8" не является допустимым атрибутом или кодировкой, и теперь имеет вид: charset="UTF-8". angular-route.js загружено до angular.min.js, который вызывал ошибку модуля и никогда не использовался — он был удален, как и неиспользуемая ссылка на jQuery. В тексте также утверждалось, что значение равно «AngularJS», тогда как в коде было установлено «Angular JS»; теперь текст совпадает.
Выход:
Строка, содержащая символы разного регистра, отображается полностью в нижнем регистре. Обратное преобразование работает аналогично.
Фильтр верхнего регистра в AngularJS
Этот фильтр является аналогом фильтра для строчных букв и отображает все символы в верхнем регистре.
Ниже контроллер отправляет строку в представление через объект scope, а фильтр преобразует её в верхний регистр.
<!-- 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 вообще нет фильтра по регистру — для добавления регистра только к первой букве требуется пользовательский фильтр, который показан в последующих разделах.
Выход:
Фильтры по типу «case» не принимают аргументов. Следующий фильтр показывает, как двоеточие передает параметр фильтру.
Числовой фильтр в AngularJS
Этот фильтр форматирует число и позволяет ограничить количество отображаемых десятичных знаков.
В приведенном ниже примере используется числовой фильтр для отображения значения, ограниченного двумя десятичными знаками. Контроллер отправляет число в представление через объект области видимости, и фильтр применяется в представлении.
<!-- 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 устанавливает два десятичных знака. Значение округляется для отображения, поэтому 3.565656 отображается как 3.57, в то время как область видимости сохраняет полное число.
Выход:
Часто бывает недостаточно просто отформатировать число, если значение представляет собой деньги, и именно этим занимается следующий фильтр.
Валютный фильтр в AngularJS
Этот фильтр форматирует число как денежное значение, добавляя перед ним символ валюты, например, $.
В приведенном ниже примере контроллер отправляет число в представление через объект scope, и в представлении применяется фильтр валюты.
<!-- 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:"£"}}.
Выход:
Строки и числа представляют собой простые значения. Встроенный фильтр обрабатывает целые объекты.
JSON-фильтр в AngularJS
Этот фильтр преобразует объект в отформатированный формат. 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иtutorialName: "Angular"помещается в переменную-член, называемуюtutorialи прикреплен к объекту области видимости. - За символом фильтра (|) следует
jsonфильтр, который сериализует объект в текстовый формат JSON с отступами.
⚠️ Исправление: В оригинале это значение описывалось как «число» и как «строка типа JSON». На самом деле это ни то, ни другое. Это... JavaОбъект скрипта, а JSON-фильтр преобразует его в строку JSON для отображения.
Выход:
Эти пять фильтров охватывают распространенные случаи. Если ни один из них не дает нужного результата, вы можете написать свой собственный.
Пользовательский фильтр 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».
- Фильтр применяется в представлении с использованием того же синтаксиса конвейера, что и любой встроенный фильтр.
Примечание: Наконечник: Названия фильтров обычно пишутся строчными буквами или в стиле camelCase. «Demofilter» подходит, но название, например, такое: appendTutorial Читается лучше и не конфликтует со встроенным именем.
Выход:
К переданной строке добавлено слово «Tutorial». tutorial переменная. Этот фильтр всегда добавляет один и тот же текст, который можно настроить в следующем разделе.
Как передать аргументы пользовательскому фильтру
Приведённый выше фильтр жёстко задаёт добавляемый текст, поэтому он может выполнять только одну функцию. Встроенные фильтры, такие как... number:2 Принимает аргумент после двоеточия, и пользовательский фильтр тоже может: каждый параметр после первого соответствует аргументу, разделенному двоеточием, в представлении.
Процесс включает три этапа: добавление параметров после 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
Две детали легко упустить из виду. Аргументы представляют собой выражения 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Эта форма предоставляет функцию фильтра напрямую, и её можно вызвать немедленно. Обе формы приводят к одной и той же функции, поэтому выбор носит стилистический характер.
Два варианта использования встречаются довольно часто. Первый — подготовка полезной нагрузки: данные обычно должны поступать в API по фиксированному шаблону, и $filter('date')(value, 'yyyy-MM-dd') Второй способ — сужение коллекции только в контроллере, а не в конце. orderBy в нг-повторить выражение, которое перезапускается при каждом обновлении.
Фильтры, внедренные таким образом, по-прежнему регистрируются в модуле, поэтому пользовательский фильтр необходимо объявить с помощью app.filter прежде чем кто-либо из диспетчеров попросит $filter Для этого AngularJS выдает ошибку "неизвестный поставщик".
Вызов фильтра в JavaСкрипт отличается от шаблона одним важным моментом: результат вычисляется один раз и сохраняется в области видимости, а не пересчитывается при каждом обновлении. Это делает его более быстрым вариантом для значений, которые редко меняются, и неподходящим вариантом для значений, которые должны меняться. track пользовательских данных.












