Filtros AngularJS y filtro personalizado AngularJS con ejemplo
โก Resumen inteligente
En AngularJS, un filtro formatea el valor de una expresiรณn para su visualizaciรณn sin alterar los datos subyacentes. Los filtros integrados cubren mayรบsculas y minรบsculas, nรบmeros, moneda y JSON, mientras que un filtro personalizado gestiona cualquier regla de formato que el framework no proporcione.

ยฟQuรฉ es el filtro en AngularJS?
A Filtrar en AngularJS Ayuda a formatear el valor de una expresiรณn para mostrarlo al usuario sin modificar el valor original. Por ejemplo, si desea que una cadena se muestre en minรบsculas o mayรบsculas, puede hacerlo mediante filtros. Los filtros integrados, como ยซminรบsculasยป y ยซmayรบsculasยป, devuelven la cadena en el formato solicitado. Ademรกs, existen otros filtros para nรบmeros, moneda y JSON.
โ ๏ธ Nota de versiรณn: AngularJS (la rama 1.x) llegรณ al final de su ciclo de vida el 31 de diciembre de 2021 y ya no recibe actualizaciones de seguridad. Todo lo que se indica a continuaciรณn sigue siendo vรกlido para el mantenimiento de las aplicaciones AngularJS existentes; en las versiones modernas de Angular, esta misma funciรณn la cumple una tuberรญa (pipe).
Los filtros se aplican en la vista con el carรกcter de barra vertical (|). Antes de analizar cada uno, conviene saber por quรฉ querrรญas escribir el tuyo propio.
Filtro de minรบsculas en AngularJS
Este filtro toma una cadena de texto y muestra todos sus caracteres en minรบsculas.
A continuaciรณn, un controlador envรญa una cadena a la vista a travรฉs del objeto scope, y un filtro la convierte a minรบsculas.
<!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 Explicaciรณn
- La cadena mixta "Angular JS" se coloca en una variable miembro llamada
tutorialNameen el objeto de รกmbito. - El sรญmbolo de filtro (|) marca la salida para la transformaciรณn, y el
lowercaseLa palabra clave aplica el filtro incorporado que convierte toda la cadena a minรบsculas.
โ ๏ธ Se han aplicado correcciones a todos los anuncios. Los seis ejemplos originales compartรญan tres defectos. chrset="UTF 8" no es un atributo o codificaciรณn vรกlido y ahora es charset="UTF-8". angular-route.js cargado antes angular.min.js, que genera un error de mรณdulo y nunca se utilizรณ; se eliminรณ, al igual que la referencia a jQuery que no se usaba. El texto tambiรฉn indicaba que el valor era "AngularJS", mientras que el cรณdigo establecรญa "Angular JS"; ahora el texto coincide.
Salida:
La cadena con mayรบsculas y minรบsculas se muestra completamente en minรบsculas. La transformaciรณn inversa funciona de la misma manera.
Filtro de mayรบsculas en AngularJS
Este filtro es la contraparte del filtro de minรบsculas, ya que muestra todos los caracteres en mayรบsculas.
A continuaciรณn, un controlador envรญa una cadena a la vista a travรฉs del objeto scope, y un filtro la convierte a mayรบsculas.
<!-- 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 Explicaciรณn
- La cadena mixta "Angular JS" se coloca en
tutorialNamey adjunto al objeto de รกmbito. - El sรญmbolo de filtro (|) va seguido del
uppercasepalabra clave, por lo que el filtro incorporado convierte toda la cadena a mayรบsculas.
โ ๏ธ Correcciรณn: La introducciรณn original presentaba esta secciรณn como ยซun ejemplo de filtro de mayรบsculas en AngularJS con la opciรณn de minรบsculasยป, lo cual es completamente errรณneo. Esta secciรณn muestra el filtro de mayรบsculas, y AngularJS no tiene ningรบn filtro de mayรบsculas; para poner en mayรบscula solo la primera letra se requiere un filtro personalizado, cuya creaciรณn se explica en secciones posteriores.
Salida:
Los filtros de mayรบsculas y minรบsculas no admiten argumentos. El siguiente filtro muestra cรณmo dos puntos pasan un parรกmetro a un filtro.
Filtro numรฉrico en AngularJS
Este filtro da formato a un nรบmero y puede limitar la cantidad de decimales que se muestran.
El siguiente ejemplo utiliza el filtro numรฉrico para mostrar un valor con solo dos decimales. Un controlador envรญa el nรบmero a la vista mediante el objeto scope, y el filtro se aplica en la vista.
<!-- 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 Explicaciรณn
- Un nรบmero con muchos decimales se coloca en una variable miembro llamada
tutorialIDy adjunto al objeto de รกmbito. - El sรญmbolo de filtro (|) va seguido de
number:2El signo de dos puntos pasa un argumento, y el 2 establece dos decimales. El valor se redondea para su visualizaciรณn, por lo que 3.565656 aparece como 3.57, mientras que el รกmbito conserva el nรบmero completo.
Salida:
Formatear un nรบmero simple a menudo no es suficiente cuando el valor representa dinero, que es lo que maneja el siguiente filtro.
Filtro de moneda en AngularJS
Este filtro formatea un nรบmero como un valor monetario, anteponiรฉndole un sรญmbolo de moneda como el sรญmbolo $.
En el ejemplo siguiente, un controlador envรญa un nรบmero a la vista a travรฉs del objeto scope, y el filtro de moneda se aplica en la vista.
<!-- 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 Explicaciรณn
- Se coloca un nรบmero en una variable miembro llamada
tutorialpricey adjunto al objeto de รกmbito. - El sรญmbolo de filtro (|) va seguido del
currencyfiltrar.
โ ๏ธ Correcciรณn: El original afirmaba que la moneda โdepende de la configuraciรณn de idioma aplicada a la mรกquinaโ. No es asรญ. AngularJS utiliza la configuraciรณn regional incluida con la biblioteca, en-US por defecto, por lo que el sรญmbolo es $ independientemente del sistema operativo. Cargar la coincidencia angular-locale_*.js archivo, o pasar el sรญmbolo directamente: {{tutorialprice | currency:"ยฃ"}}.
Salida:
Las cadenas de texto y los nรบmeros son valores simples. El filtro integrado final procesa objetos completos.
Filtro JSON en AngularJS
Este filtro convierte un objeto en un objeto formateado. JSON cadena, que resulta รบtil para inspeccionar los datos de alcance durante el desarrollo.
En el ejemplo siguiente, un controlador envรญa un objeto a la vista a travรฉs del objeto scope, y el filtro JSON se aplica en la vista.
<!-- 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 Explicaciรณn
- Un objeto que contiene
TutorialID: 12ytutorialName: "Angular"se coloca en una variable miembro llamadatutorialy adjunto al objeto de รกmbito. - El sรญmbolo de filtro (|) va seguido del
jsonfiltro, que serializa el objeto en texto JSON con sangrรญa.
โ ๏ธ Correcciรณn: El original describiรณ este valor como โun nรบmeroโ y como โuna cadena de tipo JSONโ. No es ninguna de las dos cosas. Es un JavaEl objeto Script, y el filtro JSON, es lo que lo convierte en una cadena JSON para su visualizaciรณn.
Salida:
Estos cinco filtros cubren los casos mรกs comunes. Si ninguno produce el resultado que necesitas, debes escribir el tuyo propio.
Filtro personalizado AngularJS
En ocasiones, los filtros integrados de AngularJS no cumplen con los requisitos de formato de salida. En tal caso, se puede crear un filtro personalizado de AngularJS que devuelva la salida del modo requerido.
Un filtro personalizado se registra en un mรณdulo y luego se comporta exactamente igual que uno integrado. Las secciones siguientes tratan primero los filtros estรกndar, ya que un filtro personalizado utiliza la misma sintaxis de tuberรญa, y luego muestran cรณmo crear uno.
Cรณmo crear un filtro personalizado en AngularJS
En el ejemplo siguiente, una cadena pasa desde el controlador a la vista a travรฉs del objeto scope, pero no deberรญa mostrarse tal cual. Un filtro personalizado en AngularJS agrega otra cadena y muestra el resultado final.
<!-- 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 Explicaciรณn
- La cadena โAngularโ se coloca en una variable miembro llamada
tutorialy adjunto al objeto de รกmbito. - AngularJS proporciona la
filterMรฉtodo de registro utilizado para crear un filtro personalizado. Se le ha dado el nombre de 'Demofilter', y ese nombre es al que hace referencia la vista. - Esta es la forma estรกndar de un filtro personalizado: la funciรณn registrada es una personal Devuelve la funciรณn que realiza el trabajo. Esa funciรณn recibe el valor que se estรก filtrando como su primer parรกmetro y devuelve el resultado; en este caso, la entrada con "Tutorial" aรฑadido.
- El filtro se aplica en la vista utilizando la misma sintaxis de tuberรญa que cualquier filtro integrado.
๐ Tip: Los nombres de los filtros se escriben convencionalmente en minรบsculas o en formato camelCase. 'Demofilter' funciona, pero un nombre como appendTutorial Se lee mejor y evita entrar en conflicto con un nombre predefinido.
Salida:
La palabra 'Tutorial' se ha aรฑadido a la cadena pasada en el tutorial variable. Este filtro siempre agrega el mismo texto, que se configura en la siguiente secciรณn.
Cรณmo pasar argumentos a un filtro personalizado
El filtro anterior codifica de forma fija el texto que agrega, por lo que solo puede hacer una cosa. Los filtros integrados como number:2 Se acepta un argumento despuรฉs de dos puntos, y un filtro personalizado tambiรฉn puede hacerlo: cada parรกmetro despuรฉs del primero se asigna a un argumento separado por dos puntos en la vista.
Se requieren tres pasos: agregar parรกmetros despuรฉs input En la funciรณn devuelta, proporcione un valor predeterminado para cualquier elemento opcional para que el filtro siga funcionando cuando se omita el argumento, luego pase los argumentos en la vista separados por dos puntos.
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; }; });
La vista se lee entonces de la siguiente manera, donde โTutorialโ se convierte en suffix y el guion se convierte separator.
{{tutorial | appendText:"Tutorial"}} // Angular Tutorial
{{tutorial | appendText:"Tutorial":" - "}} // Angular - Tutorial
Hay dos detalles que se pueden pasar por alto fรกcilmente. Los argumentos son expresiones de AngularJS, por lo que una cadena literal debe ir entre comillas, mientras que una palabra sin comillas se interpreta como una propiedad del รกmbito. Los filtros tambiรฉn se encadenan, y cada uno recibe la salida del anterior: {{tutorial | appendText:"Tutorial" | uppercase}}.
โ ๏ธ Advertencia: Mantenga un filtro puro: misma salida para la misma entrada, sin cambios externos. AngularJS almacena en cachรฉ un filtro puro y lo vuelve a ejecutar solo cuando cambia la entrada. Un filtro que lee el reloj o modifica un servicio debe estar marcado $stateful, lo que desactiva ese almacenamiento en cachรฉ y ejecuta el filtro en cada ciclo de digestiรณn, una causa comรบn de pรกginas lentas.
Los filtros no se limitan a las plantillas. El mismo filtro puede ser llamado desde JavaGuion, como se muestra a continuaciรณn.
Cรณmo usar filtros en un controlador con el servicio $filter
Aplicar un filtro en la vista es el caso comรบn, pero a veces se necesita el valor transformado dentro del controlador, por ejemplo, antes de enviar datos a un servidor. AngularJS expone todos los filtros registrados, tanto integrados como personalizados, a travรฉs de $filter servicio. Inyรฉctelo, llรกmelo con el nombre del filtro para recuperar la funciรณn de filtro, luego invรณquela con el valor y cualquier argumento.
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"); }]);
Tambiรฉn existe una forma mรกs corta: inyectar el nombre del filtro seguido de Filter, como uppercaseFilterProporciona la funciรณn de filtro directamente y se puede llamar de inmediato. Ambas formas resuelven en la misma funciรณn, por lo que la elecciรณn es una cuestiรณn de estilo.
Dos usos se repiten constantemente. El primero es preparar una carga รบtil: una fecha generalmente tiene que llegar a una API siguiendo un patrรณn fijo, y $filter('date')(value, 'yyyy-MM-dd') lo produce sin tocar el valor vinculado al formulario. El segundo es reducir una colecciรณn una vez en el controlador, en lugar de dejar orderBy en una ng-repetir expresiรณn donde se vuelve a ejecutar en cada digest.
Los filtros inyectados de esta manera aรบn se registran en el mรณdulo, por lo que se debe declarar un filtro personalizado con app.filter antes de que cualquier controlador pregunte $filter para ello. De lo contrario, AngularJS arroja un error de proveedor desconocido.
Llamando a un filtro en JavaEl script se diferencia de una plantilla en un aspecto importante: el resultado se calcula una sola vez y se almacena en el รกmbito en lugar de recalcularse en cada digest. Esto lo convierte en la opciรณn mรกs rรกpida para un valor que rara vez cambia, y la opciรณn incorrecta para uno que debe tracEntrada del usuario k.












