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.

  • ๐Ÿงพ Kerneprincip: Et filter transformerer kun det, som visningen viser; vรฆrdien, der er gemt pรฅ scope-objektet, รฆndres aldrig.
  • โž– Rรธrsyntaks: Den lodrette streg adskiller udtrykket fra filternavnet, og et kolon sender et argument til det.
  • ๐Ÿ”ค Sagfiltre: Smรฅ og store bogstaver konverterer en streng til visning, og der findes ikke et filter for store bogstaver i AngularJS.
  • ๐Ÿ”ข Nummer og valuta: tal begrรฆnser decimaler, mens valuta sรฆtter et lokalitetsdrevet symbol foran vรฆrdien.
  • ๐Ÿ› ๏ธ Tilpassede filtre: Registrering af en fabrik, der returnerer en funktion, opretter et genbrugeligt filter, der er tilgรฆngeligt pรฅ tvรฆrs af hele modulet.
  • โšก Renhed betyder noget: Et filter skal returnere det samme output for det samme input, fordi AngularJS cacher resultater og springer genkรธrsel af rene filtre over.

AngularJS-filtre og brugerdefinerede filtre

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.

Filter med smรฅ bogstaver i 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 Forklaring

  1. Strengen "Angular JS" med blandede bogstaver placeres i en medlemsvariabel kaldet tutorialName pรฅ omfangsobjektet.
  2. Filtersymbolet (|) markerer outputtet til transformation, og lowercase Nรธ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:

Filter med smรฅ bogstaver i AngularJS

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.

Stort filter i 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 Forklaring

  1. Strengen "Angular JS" med blandede store og smรฅ bogstaver placeres i tutorialName og knyttet til scope-objektet.
  2. Filtersymbolet (|) efterfรธlges af uppercase nรธ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:

Stort filter i AngularJS

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.

Nummerfilter i 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 Forklaring

  1. Et tal med mange decimaler placeres i en medlemsvariabel kaldet tutorialID og knyttet til scope-objektet.
  2. 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:

Nummerfilter i AngularJS

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.

Valutafilter i 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 Forklaring

  1. Et tal placeres i en medlemsvariabel kaldet tutorialprice og knyttet til scope-objektet.
  2. Filtersymbolet (|) efterfรธlges af currency filter.

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

Valutafilter i AngularJS

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.

JSON-filter i 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 Forklaring

  1. En genstand, der holder TutorialID: 12 og tutorialName: "Angular" placeres i en medlemsvariabel kaldet tutorial og knyttet til scope-objektet.
  2. Filtersymbolet (|) efterfรธlges af json filter, 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:

JSON-filter i AngularJS

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.

Opret brugerdefineret filter i 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 Forklaring

  1. Strengen "Angular" placeres i en medlemsvariabel kaldet tutorial og knyttet til scope-objektet.
  2. AngularJS leverer filter registreringsmetode, der bruges til at oprette et brugerdefineret filter. 'Demofilter' er navnet, og det er det navn, visningen refererer til.
  3. 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.
  4. 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:

Opret brugerdefineret filter i AngularJS

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.

Ofte Stillede Spรธrgsmรฅl

Nej. AngularJS leverer kun smรฅ og store bogstaver. Stort fรธrste bogstav i hvert ord krรฆver et brugerdefineret filter, der opdeler strengen og genopbygger den, eller en CSS teksttransformeringsregel, hvis รฆndringen udelukkende er visuel.

Filteret er registreret pรฅ et andet modul end det, der bootstrappes af ng-app, eller scriptet, der definerer det, kรธrer, fรธr AngularJS indlรฆses. Registrer filteret pรฅ det samme modul, og indlรฆs biblioteket fรธrst.

Ja. Piping en samling indeni ng-gentag filtrerer eller ordner elementerne, fรธr de gengives. Filteret modtager hele arrayet og skal returnere et array.

Ja. AI Assistenterne producerer fabrikken, den returnerede funktion og view-syntaksen ud fra en simpel beskrivelse af formateringsreglen. Kontroller, at det genererede filter beskytter mod udefineret input.

AI-vรฆrktรธjer omskriver fabrikken som en klasse, der implementerer PipeTransform, og flytter hver ekstra parameter ind i transform-metoden. RevSe ethvert $stateful-filter manuelt, fordi urene pipes skal deklareres eksplicit.

Opsummer dette indlรฆg med: