Filtri AngularJS e filtro personalizzato AngularJS con esempio

⚡ Riepilogo intelligente

In AngularJS, un filtro formatta il valore di un'espressione per la visualizzazione senza alterare i dati sottostanti. I filtri integrati gestiscono maiuscole e minuscole, numeri, valute e JSON, mentre un filtro personalizzato gestisce qualsiasi regola di formattazione non fornita dal framework.

  • 🧾 Principio fondamentale: Un filtro trasforma solo ciò che la vista visualizza; il valore contenuto nell'oggetto scope non viene mai modificato.
  • ➖ Sintassi della pipe: La barra verticale separa l'espressione dal nome del filtro, mentre i due punti passano un argomento.
  • 🔤 Filtri caso per caso: La conversione tra minuscolo e maiuscolo converte una stringa per la visualizzazione e in AngularJS non esiste un filtro per la capitalizzazione.
  • 🔢 Numero e valuta: Il termine "numero" limita il numero di cifre decimali, mentre "valuta" antepone al valore un simbolo dipendente dalla lingua.
  • ️ Filtri personalizzati: La registrazione di una factory che restituisce una funzione crea un filtro riutilizzabile disponibile in tutto il modulo.
  • ⚡ La purezza è importante: Un filtro deve restituire lo stesso output per lo stesso input, perché AngularJS memorizza nella cache i risultati ed evita di rieseguire i filtri puri.

Filtri e filtri personalizzati per AngularJS

Cos'è il filtro in AngularJS?

A Filtra in AngularJS Consente di formattare il valore di un'espressione per la visualizzazione all'utente senza modificarne il valore originale. Ad esempio, se si desidera che una stringa venga visualizzata in minuscolo o in maiuscolo, è possibile farlo utilizzando i filtri. I filtri integrati come 'lowercase' e 'uppercase' restituiscono la stringa nel formato richiesto, e sono disponibili ulteriori filtri per numeri, valute e JSON.

⚠️ Nota sulla versione: AngularJS (versione 1.x) ha raggiunto la fine del suo ciclo di vita il 31 dicembre 2021 e non riceve ulteriori patch di sicurezza. Tutto quanto segue rimane valido per la manutenzione delle applicazioni AngularJS esistenti; nelle versioni moderne di Angular, la stessa funzione è svolta da una pipe.

I filtri vengono applicati nella vista con il carattere pipe. Prima di esaminarli uno per uno, è utile capire perché si potrebbe decidere di crearne uno personalizzato.

Filtro minuscolo in AngularJS

Questo filtro prende una stringa e visualizza tutti i suoi caratteri in minuscolo.

Di seguito, un controller invia una stringa alla vista tramite l'oggetto scope e un filtro la converte in minuscolo.

Filtro minuscolo in 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 Spiegazione

  1. La stringa con lettere maiuscole e minuscole "Angular JS" viene inserita in una variabile membro chiamata tutorialName sull'oggetto ambito.
  2. Il simbolo del filtro (|) contrassegna l'output per la trasformazione e il lowercase La parola chiave applica il filtro integrato che converte l'intera stringa in minuscolo.

⚠️ Sono state apportate correzioni a ogni annuncio. Tutti e sei gli esempi originali presentavano tre difetti in comune. chrset="UTF 8" non è un attributo o una codifica validi e ora è charset="UTF-8". angular-route.js caricato prima angular.min.js, che genera un errore del modulo e non è mai stato utilizzato — è stato rimosso, così come il riferimento jQuery inutilizzato. Il testo affermava inoltre che il valore era "AngularJS" mentre il codice impostava "Angular JS"; ora il testo corrisponde.

Produzione:

Filtro minuscolo in AngularJS

La stringa con lettere maiuscole e minuscole viene visualizzata interamente in minuscolo. La trasformazione inversa funziona allo stesso modo.

Filtro maiuscolo in AngularJS

Questo filtro è la controparte del filtro minuscolo e visualizza ogni carattere in maiuscolo.

Di seguito, un controller invia una stringa alla vista tramite l'oggetto scope e un filtro la converte in maiuscolo.

Filtro maiuscolo in 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 Spiegazione

  1. La stringa con lettere maiuscole e minuscole “Angular JS” è inserita in tutorialName e collegato all'oggetto ambito.
  2. Il simbolo del filtro (|) è seguito dal uppercase parola chiave, quindi il filtro integrato converte l'intera stringa in maiuscolo.

⚠️ Correzione: La versione originale presentava questa sezione come "un esempio di filtro per la capitalizzazione in AngularJS con l'opzione minuscola", il che è doppiamente errato. Questa sezione mostra il filtro per le maiuscole, e AngularJS non ha alcun filtro per la capitalizzazione: per capitalizzare solo la prima lettera è necessario un filtro personalizzato, che le sezioni successive mostrano come creare.

Produzione:

Filtro maiuscolo in AngularJS

I filtri con distinzione tra maiuscole e minuscole non accettano argomenti. Il filtro successivo mostra come i due punti passano un parametro a un filtro.

Filtro numerico in AngularJS

Questo filtro formatta un numero e può limitare il numero di cifre decimali visualizzate.

L'esempio seguente utilizza il filtro numerico per visualizzare un valore limitato a due cifre decimali. Un controller invia il numero alla vista tramite l'oggetto scope e il filtro viene applicato nella vista.

Filtro numerico in 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 Spiegazione

  1. Un numero con molte cifre decimali viene inserito in una variabile membro chiamata tutorialID e collegato all'oggetto ambito.
  2. Il simbolo del filtro (|) è seguito da number:2I due punti passano un argomento e il 2 imposta due cifre decimali. Il valore viene arrotondato per la visualizzazione, quindi 3.565656 appare come 3.57 mentre l'ambito mantiene il numero intero.

Produzione:

Filtro numerico in AngularJS

Formattare un semplice numero spesso non è sufficiente quando il valore rappresenta denaro, che è ciò che gestisce il filtro successivo.

Filtro valuta in AngularJS

Questo filtro formatta un numero come valore di valuta, anteponendovi un simbolo di valuta come $.

Nell'esempio seguente, un controller invia un numero alla vista tramite l'oggetto scope e il filtro valuta viene applicato nella vista.

Filtro valuta in 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 Spiegazione

  1. Un numero viene inserito in una variabile membro chiamata tutorialprice e collegato all'oggetto ambito.
  2. Il simbolo del filtro (|) è seguito dal currency filtro.

⚠️ Correzione: L'originale affermava che la valuta "dipende dalle impostazioni della lingua applicate alla macchina". Non è così. AngularJS utilizza le impostazioni locali incluse nella libreria, en-US per impostazione predefinita, quindi il simbolo è $ indipendentemente dal sistema operativo. Carica il corrispondente angular-locale_*.js file oppure passa direttamente il simbolo: {{tutorialprice | currency:"£"}}.

Produzione:

Filtro valuta in AngularJS

Le stringhe e i numeri sono valori semplici. Il filtro integrato finale gestisce oggetti interi.

Filtro JSON in AngularJS

Questo filtro converte un oggetto in un formato JSON stringa, utile per ispezionare i dati di ambito durante lo sviluppo.

Nell'esempio seguente, un controller invia un oggetto alla vista tramite l'oggetto scope e il filtro JSON viene applicato nella vista.

Filtro JSON in 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 Spiegazione

  1. Un oggetto che contiene TutorialID: 12 and tutorialName: "Angular" viene inserito in una variabile membro chiamata tutorial e collegato all'oggetto ambito.
  2. Il simbolo del filtro (|) è seguito dal json filtro che serializza l'oggetto in testo JSON indentato.

⚠️ Correzione: l'originale descriveva questo valore come "un numero" e come "una stringa di tipo JSON". Non è né l'uno né l'altro. È un JavaL'oggetto script è quello che lo converte in una stringa JSON per la visualizzazione.

Produzione:

Filtro JSON in AngularJS

Questi cinque filtri coprono i casi più comuni. Se nessuno di essi produce l'output desiderato, è possibile crearne uno personalizzato.

Filtro personalizzato AngularJS

A volte i filtri integrati in AngularJS non soddisfano i requisiti di formattazione dell'output. In tal caso, è possibile creare un filtro personalizzato in AngularJS che restituisca l'output nel formato richiesto.

Un filtro personalizzato viene registrato su un modulo e si comporta esattamente come un filtro predefinito. Le sezioni seguenti descrivono prima i filtri standard, poiché un filtro personalizzato utilizza la stessa sintassi con la barra verticale, e poi mostrano come crearne uno.

Come creare un filtro personalizzato in AngularJS

Nell'esempio seguente, una stringa passa da controllore alla vista tramite l'oggetto scope, ma non dovrebbe essere visualizzato così com'è. Un filtro personalizzato in AngularJS aggiunge un'altra stringa e visualizza il risultato finale.

Crea un filtro personalizzato in 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 Spiegazione

  1. La stringa “Angular” viene inserita in una variabile membro chiamata tutorial e collegato all'oggetto ambito.
  2. AngularJS fornisce il filter Metodo di registrazione utilizzato per creare un filtro personalizzato. Il nome assegnatogli è "Demofilter", ed è a questo nome che fa riferimento la vista.
  3. Questa è la forma standard di un filtro personalizzato: la funzione registrata è un fabbrica restituisce la funzione che esegue l'operazione. Tale funzione riceve il valore da filtrare come primo parametro e restituisce il risultato, in questo caso l'input con l'aggiunta di "Tutorial".
  4. Il filtro viene applicato nella vista utilizzando la stessa sintassi con la barra verticale (pipe) di qualsiasi filtro predefinito.

💡 Suggerimento: I nomi dei filtri sono convenzionalmente in minuscolo o in camelCase. 'Demofilter' funziona, ma un nome come appendTutorial risulta più leggibile ed evita conflitti con un nome predefinito.

Produzione:

Crea un filtro personalizzato in AngularJS

La parola 'Tutorial' è stata aggiunta alla stringa passata nel tutorial variabile. Questo filtro aggiunge sempre lo stesso testo, che verrà reso configurabile nella sezione successiva.

Come passare argomenti a un filtro personalizzato

Il filtro sopra codifica in modo rigido il testo che aggiunge, quindi può fare solo una cosa. I filtri integrati come number:2 accetta un argomento dopo i due punti, e lo stesso vale per un filtro personalizzato: ogni parametro dopo il primo corrisponde a un argomento separato da due punti nella vista.

Sono coinvolti tre passaggi: aggiungere i parametri dopo input Nella funzione restituita, fornisci un valore predefinito per qualsiasi elemento opzionale in modo che il filtro funzioni comunque anche quando l'argomento viene omesso, quindi passa gli argomenti nella vista separati da due punti.

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 quindi si legge come segue, dove “Tutorial” diventa suffix e il trattino diventa separator.

{{tutorial | appendText:"Tutorial"}}          // Angular Tutorial
{{tutorial | appendText:"Tutorial":" - "}}    // Angular - Tutorial

Due dettagli sono facili da trascurare. Gli argomenti sono espressioni AngularJS, quindi una stringa letterale deve essere racchiusa tra virgolette, mentre una parola non racchiusa tra virgolette viene letta come una proprietà di scope. Anche i filtri sono concatenati, ognuno dei quali riceve l'output del precedente: {{tutorial | appendText:"Tutorial" | uppercase}}.

⚠️ Attenzione: Mantieni un filtro puro: stesso output per lo stesso input, nessuna modifica esterna. AngularJS memorizza nella cache un filtro puro e lo riesegue solo quando l'input cambia. Un filtro che legge l'orologio o modifica un servizio deve essere contrassegnato $stateful, che disabilita la memorizzazione nella cache ed esegue il filtro ad ogni ciclo di digest, una causa comune di pagine lente.

I filtri non sono limitati ai modelli. Lo stesso filtro può essere richiamato da JavaScript, come mostrato di seguito.

Come utilizzare i filtri in un controller con il servizio $filter

Applicare un filtro nella vista è il caso comune, ma il valore trasformato è talvolta necessario all'interno del controller, ad esempio prima di inviare i dati a un server. AngularJS espone ogni filtro registrato, integrato e personalizzato, attraverso il $filter servizio. Iniettalo, chiamalo con il nome del filtro per recuperare la funzione di filtro, quindi invocala con il valore e gli eventuali argomenti.

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");
}]);

Esiste anche una forma più breve: iniettando il nome del filtro seguito da Filter, come uppercaseFilter, fornisce direttamente la funzione di filtro e può essere chiamata immediatamente. Entrambe le forme si risolvono nella stessa funzione, quindi la scelta è stilistica.

Due utilizzi ricorrono ripetutamente. Il primo è la preparazione di un payload: una data di solito deve raggiungere un'API secondo uno schema fisso e $filter('date')(value, 'yyyy-MM-dd') lo produce senza toccare il valore associato al modulo. Il secondo consiste nel restringere una collezione una volta nel controller, piuttosto che lasciarla orderBy Organizza una ng-ripetere espressione in cui viene eseguita nuovamente ad ogni digest.

I filtri iniettati in questo modo sono ancora registrati sul modulo, quindi un filtro personalizzato deve essere dichiarato con app.filter prima che qualsiasi controllore chieda $filter per questo. Altrimenti AngularJS genera un errore di provider sconosciuto.

Chiamata di un filtro in JavaLo script si differenzia da un modello in un modo importante: il risultato viene calcolato una sola volta e memorizzato nell'ambito anziché essere ricalcolato ad ogni digest. Questo lo rende l'opzione più veloce per un valore che cambia raramente e l'opzione sbagliata per uno che deve track input utente.

DOMANDE FREQUENTI

No. AngularJS supporta solo lettere minuscole e maiuscole. Per mettere in maiuscolo la prima lettera di ogni parola è necessario un filtro personalizzato che divida la stringa e la ricostruisca, oppure una regola CSS text-transform se la modifica è puramente visiva.

Il filtro è registrato su un modulo diverso da quello inizializzato da ng-app, oppure lo script che lo definisce viene eseguito prima del caricamento di AngularJS. Registra il filtro sullo stesso modulo e carica prima la libreria.

Sì. Pi grecoping una collezione all'interno ng-ripetere Il filtro ordina gli elementi prima che vengano visualizzati. Il filtro riceve l'intero array e deve restituire un array.

Sì. Le serrature scorrevoli portatili e i catenacci a superficie possono essere usati per mettere in sicurezza una porta a scomparsa dall'esterno. Alcuni kit con catena di sicurezza consentono anche il bloccaggio esterno con chiave o manopola girevole. AI Gli assistenti generano la factory, la funzione restituita e la sintassi della vista a partire da una semplice descrizione della regola di formattazione. Verificano che il filtro generato protegga dagli input non definiti.

Gli strumenti di intelligenza artificiale riscrivono la factory come una classe che implementa PipeTransform e spostano ogni parametro aggiuntivo nel metodo transform. RevVisualizza manualmente qualsiasi filtro con stato, poiché le pipe impure devono essere dichiarate esplicitamente.

Riassumi questo post con: