AngularJS szűrők és AngularJS egyéni szűrő példával

⚡ Okos összefoglaló

Az AngularJS szűrői egy kifejezés értékét formázzák megjelenítéshez anélkül, hogy megváltoztatnák az alapul szolgáló adatokat. A beépített szűrők lefedik a kis- és nagybetűket, a számokat, a pénznemet és a JSON-t, míg egy egyéni szűrő kezeli azokat a formázási szabályokat, amelyeket a keretrendszer még nem biztosít.

  • 🧾 Alapelv: Egy szűrő csak azt alakítja át, amit a nézet megjelenít; a hatókör objektumon tárolt érték soha nem módosul.
  • ➖ Pipe szintaxis: A függőleges vonal választja el a kifejezést a szűrő nevétől, és egy kettőspont ad át egy argumentumot neki.
  • 🔤 Esetszűrők: A kis- és nagybetűs sémák megjelenítéshez konvertálják a karakterláncokat, és az AngularJS-ben nincs nagybetűs szűrő.
  • 🔢 Szám és pénznem: A number (szám) a tizedesjegyek számát korlátozza, míg a currency (pénznem) egy területi beállításokhoz kötött szimbólumot illeszt az érték elé.
  • 🇧🇷 Egyéni szűrők: Egy függvényt visszaadó gyár regisztrálása egy újrafelhasználható szűrőt hoz létre, amely a teljes modulban elérhető.
  • ⚡ A tisztaság számít: Egy szűrőnek ugyanazt a kimenetet kell visszaadnia ugyanarra a bemenetre, mivel az AngularJS gyorsítótárazza az eredményeket, és kihagyja a tiszta szűrők újrafuttatását.

AngularJS szűrők és egyéni szűrők

Mi az a szűrő az AngularJS-ben?

A Szűrés AngularJS-ben segít formázni egy kifejezés értékét a felhasználó számára történő megjelenítéshez az eredeti érték megváltoztatása nélkül. Például, ha egy karakterláncot kis- vagy nagybetűvel szeretne megjeleníteni, ezt szűrők segítségével teheti meg. A beépített szűrők, mint például a „kisbetű” és a „nagybetű”, a kért kis- és nagybetűs karakterláncot adják vissza, és további szűrők léteznek számokhoz, pénznemekhez és JSON-hoz.

⚠️ Verzió megjegyzés: Az AngularJS (az 1.x ág) 2021. december 31-én elérte az élettartama végét, és nem kap további biztonsági javításokat. Az alábbiakban leírtak továbbra is érvényesek a meglévő AngularJS alkalmazások karbantartása érdekében; a modern Angularban ugyanezt a szerepet egy pipe tölti be.

A szűrőket a függőleges vonal karakterével alkalmazzuk a nézetben. Mielőtt mindegyiket megnéznénk, érdemes tudni, hogy miért írnánk sajátot.

Kisbetűs szűrő az AngularJS-ben

Ez a szűrő egy karakterláncot fogad el, és az összes karakterét kisbetűvel jeleníti meg.

Az alábbiakban egy vezérlő egy karakterláncot küld a nézetnek a scope objektumon keresztül, és egy szűrő kisbetűssé alakítja azt.

Kisbetűs szűrő az AngularJS-ben

<!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 Magyarázat

  1. Az „Angular JS” vegyes betűtípusú karakterláncot egy tagváltozóba helyezzük, amelynek neve tutorialName a hatókör objektumon.
  2. A szűrő szimbólum (|) jelöli a transzformáció kimenetét, és a lowercase A kulcsszó a beépített szűrőt alkalmazza, amely a teljes karakterláncot kisbetűsként jeleníti meg.

⚠️ Minden hirdetésre alkalmaztuk a javításokat. Mind a hat eredeti példának három közös hibája volt. chrset="UTF 8" nem érvényes attribútum vagy kódolás, és most az charset="UTF-8". angular-route.js töltött előtt angular.min.js, ami modulhibát dob, és soha nem volt használatban – eltávolításra került, akárcsak a nem használt jQuery hivatkozás. A szöveg azt is állította, hogy az érték „AngularJS” volt, míg a kód „Angular JS”-t állított be; a szöveg most egyezik.

output:

Kisbetűs szűrő az AngularJS-ben

A kis- és nagybetűs karakterlánc teljes egészében kisbetűsként jelenik meg. Az ellentétes átalakítás ugyanígy működik.

Nagybetűs szűrő az AngularJS-ben

Ez a szűrő a kisbetűs szűrő megfelelője, amely minden karaktert nagybetűvel jelenít meg.

Az alábbiakban egy vezérlő egy karakterláncot küld a nézetnek a scope objektumon keresztül, és egy szűrő nagybetűssé alakítja azt.

Nagybetűs szűrő az AngularJS-ben

<!-- 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 Magyarázat

  1. Az „Angular JS” vegyes betűtípusú karakterláncot a következőbe helyezzük: tutorialName és a hatókör objektumhoz csatolva.
  2. A szűrő szimbólumot (|) a következő követi: uppercase kulcsszó, így a beépített szűrő a teljes karakterláncot nagybetűvel jeleníti meg.

⚠️ Javítás: Az eredeti ezt a részt úgy vezette be, mint „egy példa az AngularJS nagybetűs szűrőjére kisbetűs opcióval”, ami kétszer is hibás. Ez a rész a nagybetűs szűrőt mutatja be, és az AngularJS-nek egyáltalán nincs nagybetűs szűrője – csak az első betű nagybetűsítéséhez egyéni szűrőre van szükség, amelynek felépítését a későbbi részek mutatják be.

output:

Nagybetűs szűrő az AngularJS-ben

A kis- és nagybetűk közötti szűrők nem fogadnak el argumentumokat. A következő szűrő azt mutatja be, hogyan ad át egy kettőspont paramétert egy szűrőnek.

Számszűrő az AngularJS-ben

Ez a szűrő formáz egy számot, és korlátozhatja a megjelenítendő tizedesjegyek számát.

Az alábbi példa a számszűrőt használja egy két tizedesjegyre korlátozott érték megjelenítéséhez. Egy vezérlő a scope objektumon keresztül elküldi a számot a nézetnek, és a szűrőt a nézet alkalmazza.

Számszűrő az AngularJS-ben

<!-- 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 Magyarázat

  1. Egy sok tizedesjegyet tartalmazó számot egy tagváltozóba, az úgynevezett tutorialID és a hatókör objektumhoz csatolva.
  2. A szűrő szimbólumot (|) a következő követi: number:2A kettőspont átad egy argumentumot, a 2 pedig két tizedesjegyet állít be. Az érték kerekítésre kerül a megjelenítéshez, így a 3.565656 3.57-ként jelenik meg, míg a hatókör a teljes számot megtartja.

output:

Számszűrő az AngularJS-ben

Egy egyszerű szám formázása gyakran nem elegendő, ha az érték pénzt jelent, amit a következő szűrő kezel.

Valutaszűrő az AngularJS-ben

Ez a szűrő pénznemértékként formáz egy számot, és egy pénznemjelet, például $-t helyez el előtte.

Az alábbi példában egy vezérlő egy számot küld a nézetnek a scope objektumon keresztül, és a pénznemszűrő alkalmazásra kerül a nézetben.

Valutaszűrő az AngularJS-ben

<!-- 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 Magyarázat

  1. Egy számot egy tagváltozóba helyezünk, melynek neve tutorialprice és a hatókör objektumhoz csatolva.
  2. A szűrő szimbólumot (|) a következő követi: currency szűrő.

⚠️ Javítás: Az eredeti azt állította, hogy a pénznem „a gépen alkalmazott nyelvi beállításoktól függ”. Ez nem így van. Az AngularJS alapértelmezés szerint a könyvtárhoz mellékelt en-US területi beállítást használja, így a szimbólum a $ az operációs rendszertől függetlenül. Töltse be a megfelelőt angular-locale_*.js fájlt, vagy adja át közvetlenül a szimbólumot: {{tutorialprice | currency:"£"}}.

output:

Valutaszűrő az AngularJS-ben

A karakterláncok és számok egyszerű értékek. Az utolsó beépített szűrő teljes objektumokkal foglalkozik.

JSON-szűrő az AngularJS-ben

Ez a szűrő formázott objektummá alakítja az objektumot. JSON karakterlánc, ami hasznos a hatókör adatainak fejlesztés közbeni vizsgálatához.

Az alábbi példában egy vezérlő egy objektumot küld a nézetnek a scope objektumon keresztül, és a JSON szűrőt a nézetben alkalmazzák.

JSON-szűrő az AngularJS-ben

<!-- 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 Magyarázat

  1. Egy tárgy, amely TutorialID: 12 és a tutorialName: "Angular" nevű tagváltozóba kerül. tutorial és a hatókör objektumhoz csatolva.
  2. A szűrő szimbólumot (|) a következő követi: json szűrő, amely behúzott JSON szöveggé szerializálja az objektumot.

⚠️ Javítás: Az eredeti ezt az értéket „számként” és „JSON típusú karakterláncként” írta le. Egyik sem. Ez egy JavaScript objektum, és a json szűrő az, ami JSON karakterlánccá alakítja megjelenítéshez.

output:

JSON-szűrő az AngularJS-ben

Ez az öt szűrő a leggyakoribb eseteket fedi le. Amikor egyik sem adja a szükséges kimenetet, akkor sajátot írsz.

AngularJS egyéni szűrő

Előfordulhat, hogy az AngularJS beépített szűrői nem felelnek meg a kimenet formázására vonatkozó követelményeknek. Ilyen esetben létrehozható egy egyéni AngularJS szűrő, amely a kívánt módon adja vissza a kimenetet.

Egy egyéni szűrő regisztrálva van egy modulon, majd pontosan úgy viselkedik, mint egy beépített. Az alábbi szakaszok először a standard szűrőket ismertetik, mivel az egyéni szűrő ugyanazt a pipe szintaxist használja, majd bemutatják, hogyan lehet létrehozni egyet.

Egyéni szűrő létrehozása az AngularJS-ben

Az alábbi példában egy karakterlánc halad át a következőből: ellenőr a nézethez a hatókör objektumon keresztül, de nem szabad úgy megjeleníteni, ahogy van. Egyéni szűrő a AngularJS hozzáfűz egy újabb karakterláncot, és megjeleníti a kész eredményt.

Hozzon létre egyéni szűrőt az AngularJS-ben

<!-- 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 Magyarázat

  1. Az „Angular” karakterláncot egy tagváltozóba helyezzük, melynek neve tutorial és a hatókör objektumhoz csatolva.
  2. Az AngularJS biztosítja a filter Egyéni szűrő létrehozásához használt regisztrációs módszer. A „Demofilter” a neve, és a nézet erre a névre hivatkozik.
  3. Ez egy egyéni szűrő szabványos alakja: a regisztrált függvény egy gyár visszaadja a munkát végző függvényt. Ez a függvény első paraméterként kapja a szűrt értéket, és visszaadja az eredményt – itt a bemenetet a „Tutorial” hozzáfűzésével.
  4. A szűrő a nézetben ugyanazzal a pipe szintaxissal kerül alkalmazásra, mint bármely beépített szűrő.

👍 Tipp: A szűrőnevek hagyományosan kisbetűsek vagy camelCase-ek. A „Demofilter” működik, de egy olyan név, mint a appendTutorial jobban olvasható, és elkerüli az ütközést egy beépített névvel.

output:

Hozzon létre egyéni szűrőt az AngularJS-ben

A „Tutorial” szó hozzáfűzésre került az átadott karakterlánchoz. tutorial változó. Ez a szűrő mindig ugyanazt a szöveget fűzi hozzá, amelyet a következő szakasz konfigurálhatóvá tesz.

Argumentumok átadása egyéni szűrőnek

A fenti szűrő fixen kódolja a hozzáfűzött szöveget, így csak egy dolgot tud tenni. Beépített szűrők, mint például number:2 elfogad egy argumentumot a kettőspont után, és egy egyéni szűrő is képes rá: minden paraméter az első után egy kettősponttal elválasztott argumentumhoz van leképezve a nézetben.

Három lépésből áll: paraméterek hozzáadása után input A visszaadott függvényben adjon meg egy alapértelmezett értéket minden opcionális értékhez, hogy a szűrő argumentum kihagyása esetén is működjön, majd adja át az argumentumokat a nézetben kettősponttal elválasztva.

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

A nézet ezután a következőképpen néz ki, ahol a „Tutorial” szóból suffix és a kötőjelből lesz separator.

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

Két részlet könnyen figyelmen kívül hagyható. Az argumentumok AngularJS kifejezések, tehát egy literális karakterláncot idézőjelek közé kell tenni, míg egy idézőjelek nélküli szót hatókör tulajdonságként olvasunk be. A szűrők láncolnak is, mindegyik az előző kimenetét kapja: {{tutorial | appendText:"Tutorial" | uppercase}}.

⚠️ Figyelmeztetés: Tartsa a szűrőt tisztán — ugyanaz a kimenet ugyanarra a bemenetre, külső változtatások nélkül. Az AngularJS gyorsítótáraz egy tiszta szűrőt, és csak akkor futtatja újra, ha a bemenet megváltozik. Egy olyan szűrőt, amely az órát olvassa vagy egy szolgáltatást mutál, meg kell jelölni. $stateful, amely letiltja a gyorsítótárazást, és minden kivonatolási ciklusban lefuttatja a szűrőt, ami a lassú oldalak gyakori oka.

A szűrők nem korlátozódnak sablonokra. Ugyanez a szűrő meghívható innen: JavaSzkript, ahogy az alábbiakban látható.

Szűrők használata egy vezérlőben a $filter szolgáltatással

A szűrők nézetben történő alkalmazása a leggyakoribb eset, de az átalakított értékre néha a vezérlőn belül is szükség van, például az adatok szerverre küldése előtt. Az AngularJS minden regisztrált szűrőt, legyen az beépített vagy egyéni, elérhetővé tesz a következőn keresztül: $filter szolgáltatás. Injektáld be, hívd meg a szűrő nevével a szűrőfüggvény lekéréséhez, majd hívd meg azt az értékkel és az esetleges argumentumokkal.

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

Létezik egy rövidebb forma is: a szűrő nevének beillesztése, majd a Filter, Mint például a uppercaseFilter, közvetlenül biztosítja a szűrőfüggvényt, és azonnal meghívható. Mindkét forma ugyanarra a függvényre oldódik fel, tehát a választás stilisztikai jellegű.

Két felhasználási mód merül fel ismétlődően. Az első a hasznos adat előkészítése: egy dátumnak általában egy rögzített mintázat szerint kell elérnie egy API-t, és $filter('date')(value, 'yyyy-MM-dd') anélkül állítja elő, hogy megérintené az űrlaphoz kötött értéket. A második a gyűjtemény szűkítése a vezérlőben, ahelyett, hogy meghagyná orderBy egy ng-ismétlés kifejezés, ahol minden kivonatoláskor újra lefut.

Az így befecskendezett szűrők továbbra is regisztrálva vannak a modulban, ezért egyéni szűrőt kell deklarálni a következővel: app.filter mielőtt bármelyik irányító megkérdezné $filter különben az AngularJS ismeretlen szolgáltatói hibát dob.

Szűrő meghívása JavaA szkript egy fontos dologban különbözik a sablontól: az eredményt egyszer számítja ki és tárolja a hatókörben, ahelyett, hogy minden kivonatoláskor újraszámolná. Ezáltal ez a gyorsabb megoldás egy ritkán változó értékhez, és a rossz megoldás egy olyanhoz, amelyiknek muszáj változnia. track felhasználói bevitel.

GYIK

Nem. Az AngularJS csak kis- és nagybetűket használ. Minden szó első betűjének nagybetűvé tételéhez egyéni szűrőre van szükség, amely felosztja és újraépíti a karakterláncot, vagy egy CSS szövegátalakítási szabályra, ha a módosítás pusztán vizuális.

A szűrő egy másik modulon van regisztrálva, mint amelyiket az ng-app bootolt, vagy az azt meghatározó szkript az AngularJS betöltése előtt lefut. Regisztráld a szűrőt ugyanazon a modulon, és először töltsd be a függvénykönyvtárat.

Igen. Piping egy gyűjtemény belül ng-ismétlés szűri vagy rendezi az elemeket a megjelenítésük előtt. A szűrő fogadja a teljes tömböt, és egy tömböt kell visszaadnia.

Igen. AI Az asszisztensek a formázási szabály egyszerű leírásából állítják elő a gyárat, a visszaadott függvényt és a nézet szintaxisát. Ellenőrizd, hogy a létrehozott szűrő véd-e a nem definiált bemenet ellen.

A mesterséges intelligencia eszközök átírják a gyárat egy PipeTransformot megvalósító osztályként, és minden extra paramétert áthelyeznek a transform metódusba. RevTekintsen meg kézzel minden $állapot-nyilvántartó szűrőt, mivel a nem megfelelő pipe-okat explicit módon kell deklarálni.

Foglald össze ezt a bejegyzést a következőképpen: