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.

  • ๐Ÿงพ Principio bรกsico: Un filtro transforma รบnicamente lo que muestra la vista; el valor almacenado en el objeto de รกmbito nunca se modifica.
  • โž– Sintaxis de tuberรญa: La barra vertical separa la expresiรณn del nombre del filtro, y los dos puntos le pasan un argumento.
  • ๐Ÿ”ค Filtros de casos: Las mayรบsculas y minรบsculas convierten una cadena para su visualizaciรณn, y no existe ningรบn filtro de capitalizaciรณn en AngularJS.
  • ๐Ÿ”ข Nรบmero y moneda: Los nรบmeros limitan el nรบmero de decimales, mientras que las monedas anteponen un sรญmbolo determinado por la configuraciรณn regional al valor.
  • ๐Ÿ› ๏ธ Filtros personalizados: Al registrar una fรกbrica que devuelve una funciรณn, se crea un filtro reutilizable disponible en todo el mรณdulo.
  • โšก La pureza importa: Un filtro debe devolver la misma salida para la misma entrada, porque AngularJS almacena en cachรฉ los resultados y omite volver a ejecutar los filtros puros.

Filtros de AngularJS y filtros personalizados

ยฟ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.

Filtro de minรบsculas en 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 Explicaciรณn

  1. La cadena mixta "Angular JS" se coloca en una variable miembro llamada tutorialName en el objeto de รกmbito.
  2. El sรญmbolo de filtro (|) marca la salida para la transformaciรณn, y el lowercase La 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:

Filtro de minรบsculas en AngularJS

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.

Filtro de mayรบsculas en 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 Explicaciรณn

  1. La cadena mixta "Angular JS" se coloca en tutorialName y adjunto al objeto de รกmbito.
  2. El sรญmbolo de filtro (|) va seguido del uppercase palabra 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:

Filtro de mayรบsculas en AngularJS

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.

Filtro numรฉrico en 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 Explicaciรณn

  1. Un nรบmero con muchos decimales se coloca en una variable miembro llamada tutorialID y adjunto al objeto de รกmbito.
  2. 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:

Filtro numรฉrico en AngularJS

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.

Filtro de moneda en 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 Explicaciรณn

  1. Se coloca un nรบmero en una variable miembro llamada tutorialprice y adjunto al objeto de รกmbito.
  2. El sรญmbolo de filtro (|) va seguido del currency filtrar.

โš ๏ธ 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:

Filtro de moneda en AngularJS

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.

Filtro JSON en AngularJS

<!-- 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

  1. Un objeto que contiene TutorialID: 12 y tutorialName: "Angular" se coloca en una variable miembro llamada tutorial y adjunto al objeto de รกmbito.
  2. El sรญmbolo de filtro (|) va seguido del json filtro, 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:

Filtro JSON en AngularJS

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.

Crear filtro personalizado en 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 Explicaciรณn

  1. La cadena โ€œAngularโ€ se coloca en una variable miembro llamada tutorial y adjunto al objeto de รกmbito.
  2. AngularJS proporciona la filter Mรฉ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.
  3. 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.
  4. 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:

Crear filtro personalizado en AngularJS

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.

Preguntas Frecuentes

No. AngularJS solo admite mayรบsculas y minรบsculas. Para poner en mayรบscula la primera letra de cada palabra se necesita un filtro personalizado que divida la cadena y la vuelva a construir, o una regla CSS text-transform si el cambio es puramente visual.

El filtro estรก registrado en un mรณdulo diferente al que se inicializa con ng-app, o bien el script que lo define se ejecuta antes de que se cargue AngularJS. Registre el filtro en el mismo mรณdulo y cargue primero la biblioteca.

Sรญ. Piping una colecciรณn en el interior ng-repetir Filtra u ordena los elementos antes de que se muestren. El filtro recibe el array completo y debe devolver un array.

Sรญ. AI Los asistentes generan la fรกbrica, la funciรณn devuelta y la sintaxis de vista a partir de una descripciรณn simple de la regla de formato. Compruebe que el filtro generado protege contra entradas indefinidas.

Las herramientas de IA reescriben la fรกbrica como una clase que implementa PipeTransform y mueven cada parรกmetro adicional al mรฉtodo transform. RevVea cualquier filtro con estado manualmente, porque las tuberรญas impuras deben declararse explรญcitamente.

Resumir este post con: