AngularJS-filtre og AngularJS-tilpasset filter med eksempel
โก Smart opsummering
Et filter i AngularJS formaterer vรฆrdien af โโet udtryk til visning uden at รฆndre de underliggende data. Indbyggede filtre dรฆkker store og smรฅ bogstaver, tal, valuta og JSON, mens et brugerdefineret filter hรฅndterer enhver formateringsregel, som frameworket ikke allerede leverer.

Hvad er Filter i AngularJS?
A Filtrer i AngularJS hjรฆlper med at formatere vรฆrdien af โโet udtryk, sรฅ det vises til brugeren uden at รฆndre den oprindelige vรฆrdi. Hvis du f.eks. รธnsker, at en streng skal vises med enten smรฅ eller store bogstaver, kan du gรธre det ved hjรฆlp af filtre. Indbyggede filtre som 'smรฅ bogstaver' og 'store bogstaver' returnerer strengen med den รธnskede store eller smรฅ bogstaver, og der findes yderligere filtre til tal, valuta og JSON.
โ ๏ธ Versionsnotat: AngularJS (1.x-grenen) nรฅede slutningen af โโsin levetid den 31. december 2021 og modtager ikke yderligere sikkerhedsrettelser. Alt nedenfor forbliver korrekt for vedligeholdelse af eksisterende AngularJS-applikationer; i moderne Angular udfyldes den samme rolle af en pipe.
Filtre anvendes i visningen med pipe-tegnet. Fรธr du ser pรฅ hvert enkelt, er det nyttigt at vide, hvorfor du ville skrive dit eget.
Filter med smรฅ bogstaver i AngularJS
Dette filter tager en streng og viser alle dens tegn med smรฅ bogstaver.
Nedenfor sender en controller en streng til viewet via scope-objektet, og et filter konverterer den til smรฅ bogstaver.
<!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 Forklaring
- Strengen "Angular JS" med blandede bogstaver placeres i en medlemsvariabel kaldet
tutorialNamepรฅ omfangsobjektet. - Filtersymbolet (|) markerer outputtet til transformation, og
lowercaseNรธgleordet anvender det indbyggede filter, der gengiver hele strengen med smรฅ bogstaver.
โ ๏ธ Rettelser er anvendt pรฅ alle annoncer. Alle seks originale eksemplarer havde tre fejl tilfรฆldigt. chrset="UTF 8" er ikke en gyldig attribut eller kodning, og er nu charset="UTF-8". angular-route.js indlรฆst fรธr angular.min.js, som kaster en modulfejl, og som aldrig blev brugt โ den er blevet fjernet, ligesom den ubrugte jQuery-reference. Teksten hรฆvdede ogsรฅ, at vรฆrdien var "AngularJS", mens koden satte "Angular JS"; teksten matcher nu.
Output:
Strengen med blandede bogstaver gengives udelukkende med smรฅ bogstaver. Den modsatte transformation fungerer pรฅ samme mรฅde.
Stort filter i AngularJS
Dette filter er modstykket til filteret med smรฅ bogstaver, der viser alle tegn med store bogstaver.
Nedenfor sender en controller en streng til viewet via scope-objektet, og et filter konverterer den til store bogstaver.
<!-- 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 Forklaring
- Strengen "Angular JS" med blandede store og smรฅ bogstaver placeres i
tutorialNameog knyttet til scope-objektet. - Filtersymbolet (|) efterfรธlges af
uppercasenรธgleord, sรฅ det indbyggede filter gengiver hele strengen med store bogstaver.
โ ๏ธ Rettelse: Originalen introducerede dette afsnit som "et eksempel pรฅ et filter til store bogstaver i AngularJS med muligheden for smรฅ bogstaver", hvilket er forkert to gange. Dette afsnit demonstrerer filteret til store bogstaver, og AngularJS har slet intet filter til store bogstaver โ kun at bruge det fรธrste bogstav til at skrive stort krรฆver et brugerdefineret filter, som de senere afsnit viser, hvordan man opbygger.
Output:
Store/smรฅ bogstavsfiltre accepterer ingen argumenter. Det nรฆste filter viser, hvordan et kolon sender en parameter til et filter.
Nummerfilter i AngularJS
Dette filter formaterer et tal og kan begrรฆnse, hvor mange decimaler der vises.
Eksemplet nedenfor bruger talfilteret til at vise en vรฆrdi begrรฆnset til to decimaler. En controller sender tallet til visningen via scope-objektet, og filteret anvendes i visningen.
<!-- 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 Forklaring
- Et tal med mange decimaler placeres i en medlemsvariabel kaldet
tutorialIDog knyttet til scope-objektet. - Filtersymbolet (|) efterfรธlges af
number:2Kolonet sender et argument, og 2'eren angiver to decimaler. Vรฆrdien afrundes til visning, sรฅ 3.565656 vises som 3.57, mens oscilloskopet beholder det fulde tal.
Output:
Det er ofte ikke nok at formatere et almindeligt tal, nรฅr vรฆrdien reprรฆsenterer penge, hvilket er det, det nรฆste filter hรฅndterer.
Valutafilter i AngularJS
Dette filter formaterer et tal som en valutavรฆrdi og sรฆtter et valutasymbol, f.eks. $, foran.
I eksemplet nedenfor sender en controller et tal til visningen via scope-objektet, og valutafilteret anvendes i visningen.
<!-- 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 Forklaring
- Et tal placeres i en medlemsvariabel kaldet
tutorialpriceog knyttet til scope-objektet. - Filtersymbolet (|) efterfรธlges af
currencyfilter.
โ ๏ธ Rettelse: Originalen hรฆvdede, at valutaen "afhรฆnger af de sprogindstillinger, der er anvendt pรฅ maskinen". Det gรธr den ikke. AngularJS bruger den lokale kode, der fรธlger med biblioteket, en-US som standard, sรฅ symbolet er $ uanset operativsystemet. Indlรฆs det matchende angular-locale_*.js fil, eller send symbolet direkte: {{tutorialprice | currency:"ยฃ"}}.
Output:
Strenge og tal er simple vรฆrdier. Det endelige indbyggede filter hรฅndterer hele objekter.
JSON-filter i AngularJS
Dette filter konverterer et objekt til et formateret JSON streng, som er nyttig til at inspicere omfangsdata under udvikling.
I eksemplet nedenfor sender en controller et objekt til viewet via scope-objektet, og JSON-filteret anvendes i viewet.
<!-- 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 Forklaring
- En genstand, der holder
TutorialID: 12ogtutorialName: "Angular"placeres i en medlemsvariabel kaldettutorialog knyttet til scope-objektet. - Filtersymbolet (|) efterfรธlges af
jsonfilter, som serialiserer objektet til indrykket JSON-tekst.
โ ๏ธ Rettelse: Originalen beskrev denne vรฆrdi som "et tal" og som "en streng af JSON-typen". Det er ingen af โโdelene. Det er en JavaScript-objektet, og json-filteret er det, der konverterer det til en JSON-streng til visning.
Output:
Disse fem filtre dรฆkker de almindelige tilfรฆlde. Nรฅr ingen af โโdem producerer det output, du har brug for, skriver du dine egne.
AngularJS brugerdefineret filter
Nogle gange kan de indbyggede filtre i AngularJS ikke opfylde kravene til formatering af output. I sรฅdanne tilfรฆlde kan der oprettes et brugerdefineret AngularJS-filter, som returnerer outputtet pรฅ den รธnskede mรฅde.
Et brugerdefineret filter registreres pรฅ et modul og opfรธrer sig derefter prรฆcis som et indbygget filter. Afsnittene nedenfor dรฆkker fรธrst standardfiltrene, da et brugerdefineret filter bruger den samme pipe-syntaks, og viser derefter, hvordan man bygger et.
Sรฅdan opretter du brugerdefineret filter i AngularJS
I eksemplet nedenfor passerer en streng fra controller til visningen via scope-objektet, men bรธr ikke vises som det er. Et brugerdefineret filter i AngularJS tilfรธjer en anden streng og viser det fรฆrdige resultat.
<!-- 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 Forklaring
- Strengen "Angular" placeres i en medlemsvariabel kaldet
tutorialog knyttet til scope-objektet. - AngularJS leverer
filterregistreringsmetode, der bruges til at oprette et brugerdefineret filter. 'Demofilter' er navnet, og det er det navn, visningen refererer til. - Dette er standardformen for et brugerdefineret filter: den registrerede funktion er en fabrik returnerer den funktion, der udfรธrer arbejdet. Funktionen modtager den vรฆrdi, der filtreres, som sin fรธrste parameter og returnerer resultatet โ her inputtet med "Tutorial" tilfรธjet.
- Filteret anvendes i visningen ved hjรฆlp af den samme pipe-syntaks som ethvert indbygget filter.
๐ก Tip: Filternavne er traditionelt smรฅ bogstaver eller camelCase. 'Demofilter' fungerer, men et navn som f.eks. appendTutorial lรฆses bedre og undgรฅr sammenstรธd med et indbygget navn.
Output:
Ordet 'Tutorial' er blevet tilfรธjet til den streng, der er blevet sendt i tutorial variabel. Dette filter tilfรธjer altid den samme tekst, hvilket det nรฆste afsnit gรธr konfigurerbart.
Sรฅdan sender du argumenter til et brugerdefineret filter
Filteret ovenfor hardcoderer den tekst, det tilfรธjer, sรฅ det kun kan gรธre รฉn ting. Indbyggede filtre som f.eks. number:2 accepterer et argument efter et kolon, og et brugerdefineret filter kan det samme: hver parameter efter den fรธrste knyttes til et kolonsepareret argument i visningen.
Tre trin er involveret: tilfรธj parametre efter input I den returnerede funktion skal du angive en standardvรฆrdi for alt valgfrit, sรฅ filteret stadig fungerer, nรฅr argumentet udelades, og derefter sende argumenterne i visningen adskilt af kolon.
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; }; });
Visningen lyder sรฅ som fรธlger, hvor "Tutorial" bliver til suffix og bindestregen bliver til separator.
{{tutorial | appendText:"Tutorial"}} // Angular Tutorial
{{tutorial | appendText:"Tutorial":" - "}} // Angular - Tutorial
To detaljer er lette at overse. Argumenter er AngularJS-udtryk, sรฅ en streng skal vรฆre i citatet, hvorimod et ord uden citatet lรฆses som en scope-egenskab. Filtre kรฆdes ogsรฅ sammen, hvor hvert filter modtager outputtet fra det foregรฅende: {{tutorial | appendText:"Tutorial" | uppercase}}.
โ ๏ธ Advarsel: Hold et filter rent โ samme output for det samme input, ingen eksterne รฆndringer. AngularJS cacher et rent filter og kรธrer det igen, kun nรฅr inputtet รฆndres. Et filter, der lรฆser uret eller muterer en service, skal markeres. $stateful, som deaktiverer caching og kรธrer filteret pรฅ hver digest-cyklus, en almindelig รฅrsag til trรฆge sider.
Filtre er ikke begrรฆnset til skabeloner. Det samme filter kan kaldes fra JavaScript, som vist nedenfor.
Sรฅdan bruger du filtre i en controller med $filter-tjenesten
Det er almindeligt at anvende et filter i viewet, men den transformerede vรฆrdi er nogle gange nรธdvendig inde i controlleren, for eksempel fรธr data sendes til en server. AngularJS eksponerer alle registrerede filtre, bรฅde indbyggede og brugerdefinerede, via $filter service. Injicer den, kald den med filternavnet for at hente filterfunktionen, og kald den derefter med vรฆrdien og eventuelle argumenter.
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"); }]);
En kortere form findes ogsรฅ: indsprรธjtning af filternavnet efterfulgt af Filter, Sรฅsom uppercaseFilter, leverer filterfunktionen direkte, og den kan kaldes med det samme. Begge former lรธses til den samme funktion, sรฅ valget er stilistisk.
To anvendelser dukker op gentagne gange. Den fรธrste er at forberede en nyttelast: en dato skal normalt nรฅ et API i et fast mรธnster, og $filter('date')(value, 'yyyy-MM-dd') producerer den uden at rรธre den vรฆrdi, der er bundet til formen. Den anden er at indsnรฆvre en samling, nรฅr den fรธrst er i controlleren, i stedet for at lade den vรฆre orderBy i en ng-gentag udtryk, hvor det kรธres igen ved hvert digest.
Filtre, der injiceres pรฅ denne mรฅde, er stadig registreret pรฅ modulet, sรฅ et brugerdefineret filter skal deklareres med app.filter fรธr nogen controller spรธrger $filter for det. Ellers giver AngularJS en ukendt providerfejl.
Indkaldelse af et filter JavaScriptet adskiller sig fra en skabelon pรฅ รฉn vigtig mรฅde: resultatet beregnes รฉn gang og gemmes i scopet i stedet for at blive genberegnet ved hvert digest. Det gรธr det til den hurtigere mulighed for en vรฆrdi, der sjรฆldent รฆndres, og den forkerte mulighed for en, der skal... track brugerinput.












