AngularJS-filter & AngularJS-anpassat filter med exempel

โšก Smart sammanfattning

Ett filter i AngularJS formaterar vรคrdet av ett uttryck fรถr visning utan att รคndra underliggande data. Inbyggda filter tรคcker skiftlรคge, tal, valuta och JSON, medan ett anpassat filter hanterar alla formateringsregler som ramverket inte redan tillhandahรฅller.

  • ๐Ÿงพ Kรคrnprincip: Ett filter transformerar bara det som vyn visar; vรคrdet som finns pรฅ scope-objektet รคndras aldrig.
  • โž– Rรถrsyntax: Det vertikala strecket separerar uttrycket frรฅn filternamnet, och ett kolon skickar ett argument till det.
  • ๐Ÿ”ค Fallfilter: gemener och versaler konverterar en strรคng fรถr visning, och inget versalfilter finns i AngularJS.
  • ๐Ÿ”ข Nummer och valuta: number begrรคnsar decimaler, medan currency prefixar vรคrdet med en sprรฅkstyrd symbol.
  • ๐Ÿ› ๏ธ Anpassade filter: Att registrera en fabrik som returnerar en funktion skapar ett รฅteranvรคndbart filter som รคr tillgรคngligt fรถr hela modulen.
  • โšก Renhet spelar roll: Ett filter mรฅste returnera samma utdata fรถr samma indata, eftersom AngularJS cachar resultat och hoppar รถver att kรถra rena filter igen.

AngularJS-filter och anpassade filter

Vad รคr Filter i AngularJS?

A Filtrera i AngularJS hjรคlper till att formatera vรคrdet pรฅ ett uttryck fรถr visning till anvรคndaren utan att รคndra det ursprungliga vรคrdet. Om du till exempel vill att en strรคng ska visas med antingen gemener eller versaler kan du gรถra det med hjรคlp av filter. Inbyggda filter som 'gemener' och 'versaler' returnerar strรคngen med รถnskat gemener eller versaler, och ytterligare filter finns fรถr siffror, valuta och JSON.

โš ๏ธ Versionsnotering: AngularJS (1.x-grenen) nรฅdde slutet av sin livscykel den 31 december 2021 och fรฅr inga ytterligare sรคkerhetsuppdateringar. Allt nedan fรถrblir korrekt fรถr underhรฅll av befintliga AngularJS-applikationer; i moderna Angular fylls samma roll av en pipe.

Filter tillรคmpas i vyn med pipetecknet. Innan du tittar pรฅ vart och ett av dem รคr det bra att veta varfรถr du skulle skriva ditt eget.

Filter med smรฅ bokstรคver i AngularJS

Det hรคr filtret tar en strรคng och visar alla dess tecken med gemener.

Nedan skickar en kontroller en strรคng till vyn via scope-objektet, och ett filter konverterar den till gemener.

Filter med smรฅ bokstรคver 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 Fรถrklaring

  1. Strรคngen "Angular JS" med blandade gemener och versaler placeras i en medlemsvariabel som heter tutorialName pรฅ omfattningsobjektet.
  2. Filtersymbolen (|) markerar utdata fรถr transformation, och lowercase nyckelordet tillรคmpar det inbyggda filtret som รฅterger hela strรคngen med gemener.

โš ๏ธ Rรคttelser har tillรคmpats pรฅ varje annons. Alla sex originalexemplar delade tre defekter. chrset="UTF 8" รคr inte ett giltigt attribut eller en kodning, och รคr nu charset="UTF-8". angular-route.js laddad innan angular.min.js, vilket utlรถser ett modulfel, och aldrig anvรคndes โ€” den har tagits bort, liksom den oanvรคnda jQuery-referensen. Texten pรฅstod ocksรฅ att vรคrdet var "AngularJS" medan koduppsรคttningen var "Angular JS"; texten matchar nu.

Produktion:

Filter med smรฅ bokstรคver i AngularJS

Strรคngen med blandade gemener รฅterges helt med gemener. Den motsatta omvandlingen fungerar pรฅ samma sรคtt.

Versalfilter i AngularJS

Det hรคr filtret รคr motsvarigheten till gemenerfiltret och visar alla tecken som versaler.

Nedan skickar en kontroller en strรคng till vyn via scope-objektet, och ett filter konverterar den till versaler.

Versalfilter 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 Fรถrklaring

  1. Strรคngen "Angular JS" med blandade gemener och versaler placeras i tutorialName och kopplad till scope-objektet.
  2. Filtersymbolen (|) fรถljs av uppercase nyckelord, sรฅ det inbyggda filtret รฅterger hela strรคngen med versaler.

โš ๏ธ Rรคttelse: Originalet introducerade detta avsnitt som "ett exempel pรฅ versalfiltret i AngularJS med gemener", vilket รคr fel tvรฅ gรฅnger. Detta avsnitt demonstrerar versalfiltret, och AngularJS har inget versalfilter alls โ€“ att bara anvรคnda den fรถrsta bokstaven krรคver ett anpassat filter, vilket de senare avsnitten visar hur man bygger.

Produktion:

Versalfilter i AngularJS

Skiftlรคgesfilter accepterar inga argument. Nรคsta filter visar hur ett kolon skickar en parameter till ett filter.

Nummerfilter i AngularJS

Det hรคr filtret formaterar ett tal och kan begrรคnsa hur mรฅnga decimaler som visas.

Exemplet nedan anvรคnder talfiltret fรถr att visa ett vรคrde begrรคnsat till tvรฅ decimaler. En kontroller skickar talet till vyn via scope-objektet, och filtret tillรคmpas i vyn.

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 Fรถrklaring

  1. Ett tal med mรฅnga decimaler placeras i en medlemsvariabel som heter tutorialID och kopplad till scope-objektet.
  2. Filtersymbolen (|) fรถljs av number:2Kolonet skickar ett argument, och 2:an anger tvรฅ decimaler. Vรคrdet avrundas fรถr visning, sรฅ 3.565656 visas som 3.57 medan omfรฅnget behรฅller hela talet.

Produktion:

Nummerfilter i AngularJS

Att formatera ett vanligt tal rรคcker ofta inte nรคr vรคrdet representerar pengar, vilket รคr vad nรคsta filter hanterar.

Valutafilter i AngularJS

Det hรคr filtret formaterar ett tal som ett valutavรคrde och sรคtter en valutasymbol, till exempel $, i prefix.

I exemplet nedan skickar en kontroller ett tal till vyn via scope-objektet, och valutafiltret tillรคmpas i vyn.

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 Fรถrklaring

  1. Ett tal placeras i en medlemsvariabel som heter tutorialprice och kopplad till scope-objektet.
  2. Filtersymbolen (|) fรถljs av currency filtrera.

โš ๏ธ Rรคttelse: Originalet hรคvdade att valutan "beror pรฅ de sprรฅkinstรคllningar som tillรคmpas pรฅ maskinen". Det gรถr den inte. AngularJS anvรคnder den sprรฅkinstรคllning som medfรถljer biblioteket, en-US som standard, sรฅ symbolen รคr $ oavsett operativsystem. Ladda matchande angular-locale_*.js fil, eller skicka symbolen direkt: {{tutorialprice | currency:"ยฃ"}}.

Produktion:

Valutafilter i AngularJS

Strรคngar och tal รคr enkla vรคrden. Det sista inbyggda filtret hanterar hela objekt.

JSON-filter i AngularJS

Det hรคr filtret konverterar ett objekt till ett formaterat JSON strรคng, vilket รคr anvรคndbart fรถr att inspektera omfattningsdata under utveckling.

I exemplet nedan skickar en kontroller ett objekt till vyn via scope-objektet, och JSON-filtret tillรคmpas i vyn.

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 Fรถrklaring

  1. Ett fรถremรฅl som hรฅller TutorialID: 12 och tutorialName: "Angular" placeras i en medlemsvariabel som heter tutorial och kopplad till scope-objektet.
  2. Filtersymbolen (|) fรถljs av json filter, som serialiserar objektet till indenterad JSON-text.

โš ๏ธ Rรคttelse: Originalet beskrev detta vรคrde som "ett tal" och som "en strรคng av JSON-typ". Det รคr varken det ena eller det andra. Det รคr en JavaSkriptobjektet, och json-filtret รคr det som konverterar det till en JSON-strรคng fรถr visning.

Produktion:

JSON-filter i AngularJS

Dessa fem filter tรคcker de vanligaste fallen. Nรคr inget av dem producerar den utdata du behรถver skriver du ditt eget.

AngularJS anpassat filter

Ibland kan inte de inbyggda filtren i AngularJS uppfylla kraven fรถr formatering av utdata. I sรฅdana fall kan ett anpassat AngularJS-filter skapas, vilket returnerar utdata pรฅ รถnskat sรคtt.

Ett anpassat filter registreras pรฅ en modul och beter sig sedan exakt som ett inbyggt filter. Avsnitten nedan behandlar fรถrst standardfiltren, eftersom ett anpassat filter anvรคnder samma pipe-syntax, och visar sedan hur man bygger ett.

Hur man skapar anpassat filter i AngularJS

I exemplet nedan passerar en strรคng frรฅn styrenhet till vyn via scope-objektet, men ska inte visas som det รคr. Ett anpassat filter i AngularJS lรคgger till en annan strรคng och visar det fรคrdiga resultatet.

Skapa anpassat 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 Fรถrklaring

  1. Strรคngen โ€Angularโ€ placeras i en medlemsvariabel som heter tutorial och kopplad till scope-objektet.
  2. AngularJS tillhandahรฅller filter registreringsmetod som anvรคnds fรถr att skapa ett anpassat filter. 'Demofilter' รคr namnet som ges till det, och det namnet รคr vad vyn refererar till.
  3. Detta รคr standardformen fรถr ett anpassat filter: den registrerade funktionen รคr en fabrik returnerar funktionen som utfรถr arbetet. Den funktionen tar emot vรคrdet som filtreras som sin fรถrsta parameter och returnerar resultatet โ€“ hรคr indata med โ€Handledningโ€ tillagd.
  4. Filtret tillรคmpas i vyn med samma pipe-syntax som alla inbyggda filter.

๐Ÿ‘ Dricks: Filternamn รคr konventionellt gemener eller camelCase. 'Demofilter' fungerar, men ett namn som appendTutorial lรคses bรคttre och undviker krockar med ett inbyggt namn.

Produktion:

Skapa anpassat filter i AngularJS

Ordet 'Handledning' har lagts till i strรคngen som skickats i tutorial variabel. Det hรคr filtret lรคgger alltid till samma text, vilket nรคsta avsnitt gรถr konfigurerbart.

Hur man skickar argument till ett anpassat filter

Filtret ovan hรฅrdkodar texten det lรคgger till, sรฅ det kan bara gรถra en sak. Inbyggda filter som number:2 acceptera ett argument efter ett kolon, och ett anpassat filter kan ocksรฅ: varje parameter efter den fรถrsta mappas till ett kolonseparerat argument i vyn.

Tre steg รคr involverade: lรคgg till parametrar efter input I den returnerade funktionen, ange en standardvรคrde fรถr allt som รคr valfritt sรฅ att filtret fortfarande fungerar nรคr argumentet utelรคmnas, skicka sedan argumenten i vyn separerade med 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;
  };
});

Vyn ser dรฅ ut som fรถljer, dรคr โ€Handledningโ€ blir suffix och bindestrecket blir separator.

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

Tvรฅ detaljer รคr lรคtta att missa. Argument รคr AngularJS-uttryck, sรฅ en bokstavlig strรคng mรฅste citeras, medan ett ord utan citer lรคses som en scope-egenskap. Filter kedjas ocksรฅ, dรคr varje filter tar emot utdata frรฅn det fรถregรฅende: {{tutorial | appendText:"Tutorial" | uppercase}}.

โš ๏ธ Varning: Hรฅll ett filter rent โ€” samma utdata fรถr samma indata, inga externa รคndringar. AngularJS cachar ett rent filter och kรถr det bara igen nรคr indata รคndras. Ett filter som lรคser klockan eller muterar en tjรคnst mรฅste markeras. $stateful, vilket inaktiverar cachningen och kรถr filtret vid varje sammanfattningscykel, en vanlig orsak till trรถga sidor.

Filter รคr inte begrรคnsade till mallar. Samma filter kan anropas frรฅn JavaManus, som visas hรคrnรคst.

Hur man anvรคnder filter i en kontroller med $filter-tjรคnsten

Att anvรคnda ett filter i vyn รคr vanligt fรถrekommande, men det transformerade vรคrdet behรถvs ibland inuti kontrollenheten, till exempel innan data skickas till en server. AngularJS exponerar alla registrerade filter, bรฅde inbyggda och anpassade, genom $filter service. Injicera den, anropa den med filternamnet fรถr att hรคmta filterfunktionen och anropa sedan den med vรคrdet och eventuella argument.

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 kortare form finns ocksรฅ: injicering av filternamnet fรถljt av Filter, Sรฅsom uppercaseFilter, tillhandahรฅller filterfunktionen direkt och den kan anropas omedelbart. Bรฅda formerna resulterar i samma funktion, sรฅ valet รคr stilistiskt.

Tvรฅ anvรคndningsomrรฅden dyker upp upprepade gรฅnger. Den fรถrsta รคr att fรถrbereda en nyttolast: ett datum mรฅste vanligtvis nรฅ ett API i ett fast mรถnster, och $filter('date')(value, 'yyyy-MM-dd') producerar den utan att vidrรถra vรคrdet som รคr bundet till formen. Det andra รคr att begrรคnsa en samling en gรฅng i kontrollenheten, snarare รคn att lรคmna orderBy i en ng-upprepa uttryck dรคr det kรถrs igen vid varje digest.

Filter som injiceras pรฅ detta sรคtt รคr fortfarande registrerade pรฅ modulen, sรฅ ett anpassat filter mรฅste deklareras med app.filter innan nรฅgon kontrollant frรฅgar $filter fรถr det. Annars ger AngularJS ett okรคnd providerfel.

Anropa ett filter JavaSkript skiljer sig frรฅn en mall pรฅ ett viktigt sรคtt: resultatet berรคknas en gรฅng och lagras i omfรฅnget snarare รคn att berรคknas om vid varje sammanfattning. Det gรถr det till det snabbare alternativet fรถr ett vรคrde som sรคllan รคndras, och fel alternativ fรถr ett som mรฅste รคndras. track anvรคndarinmatning.

Vanliga frรฅgor

Nej. AngularJS levererar endast gemener och versaler. Att skriva den fรถrsta bokstaven i varje ord med versal krรคver ett anpassat filter som delar upp strรคngen och bygger om den, eller en CSS-texttransformeringsregel om รคndringen รคr rent visuell.

Filtret รคr registrerat pรฅ en annan modul รคn den som startats av ng-app, eller sรฅ kรถrs skriptet som definierar det innan AngularJS laddas. Registrera filtret pรฅ samma modul och ladda biblioteket fรถrst.

Ja. Piping en samling inuti ng-upprepa filtrerar eller ordnar objekten innan de renderas. Filtret tar emot hela arrayen och mรฅste returnera en array.

Ja. AI Assistenterna producerar fabriksfunktionen, den returnerade funktionen och vysyntaxen frรฅn en enkel beskrivning av formateringsregeln. Kontrollera att det genererade filtret skyddar mot odefinierad inmatning.

AI-verktyg skriver om fabriken som en klass som implementerar PipeTransform och flyttar varje extra parameter till transformmetoden. Revvisa alla $stateful-filter fรถr hand, eftersom orena pipes mรฅste deklareras explicit.

Sammanfatta detta inlรคgg med: