AngularJS-suodattimet ja AngularJS-muokattu suodatin esimerkillä

⚡ Älykäs yhteenveto

AngularJS:n suodatin muotoilee lausekkeen arvon näytettäväksi muuttamatta pohjana olevaa dataa. Sisäänrakennetut suodattimet kattavat kirjainkoon, numerot, valuutan ja JSON-muotoilun, kun taas mukautettu suodatin käsittelee kaikki muotoilusäännöt, joita kehys ei vielä tarjoa.

  • 🧾 Keskeinen periaate: Suodatin muuttaa vain näkymän näyttämän sisällön; laajuusobjektin arvoa ei koskaan muuteta.
  • ➖ Putken syntaksi: Pystysuora viiva erottaa lausekkeen suodattimen nimestä, ja kaksoispiste välittää sille argumentin.
  • 🔤 Tapaussuodattimet: Pienet ja isot kirjaimet muuntavat merkkijonon näytettäväksi, eikä AngularJS:ssä ole isojen kirjainten suodatinta.
  • 🔢 Numero ja valuutta: number rajoittaa desimaalien määrän, kun taas currency lisää arvon eteen aluekohtaisesti määritetyn symbolin.
  • 🛠️ Mukautetut suodattimet: Funktion palauttavan tehtaan rekisteröiminen luo uudelleenkäytettävän suodattimen, joka on käytettävissä koko moduulissa.
  • ⚡ Puhtaudella on väliä: Suodattimen on palautettava sama tuloste samalle syötteelle, koska AngularJS tallentaa tulokset välimuistiin ja ohittaa puhtaiden suodattimien uudelleen suorittamisen.

AngularJS-suodattimet ja mukautettu suodatin

Mikä on AngularJS:n suodatin?

A Suodatin AngularJS:ssä auttaa muotoilemaan lausekkeen arvon näytettäväksi käyttäjälle muuttamatta alkuperäistä arvoa. Jos esimerkiksi haluat merkkijonon näkyvän joko pieninä tai isoina kirjaimina, voit tehdä sen suodattimien avulla. Sisäänrakennetut suodattimet, kuten 'pienet kirjaimet' ja 'isot kirjaimet', palauttavat merkkijonon pyydetyssä kirjainkokossa, ja lisäsuodattimia on olemassa numeroille, valuutoille ja JSON-tiedostoille.

⚠️ Versiohuomautus: AngularJS (1.x-haara) lopetti toimintansa 31. joulukuuta 2021, eikä sille ole enää saatavilla tietoturvapäivityksiä. Kaikki alla oleva pysyy voimassa olemassa olevien AngularJS-sovellusten ylläpidon osalta; nykyaikaisessa Angularissa sama rooli on putkella.

Suodattimia käytetään näkymässä pystyviivan avulla. Ennen kuin tarkastelet kutakin suodatinta, on hyvä tietää, miksi kirjoittaisit oman suodattimen.

Pienet kirjaimet AngularJS:ssä

Tämä suodatin ottaa merkkijonon ja näyttää kaikki sen merkit pienillä kirjaimilla.

Alla olevassa kuvassa ohjain lähettää merkkijonon näkymään scope-objektin kautta, ja suodatin muuntaa sen pieniksi kirjaimiksi.

Pienet kirjaimet AngularJS:ssä

<!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 Selitys

  1. Sekakirjainkokoja sisältävä merkkijono ”Angular JS” sijoitetaan jäsenmuuttujaan nimeltä tutorialName laajuusobjektissa.
  2. Suodatinsymboli (|) merkitsee muunnoksen tulosteen ja lowercase avainsana käyttää sisäänrakennettua suodatinta, joka renderöi koko merkkijonon pienillä kirjaimilla.

⚠️ Korjaukset tehty jokaiseen ilmoitukseen. Kaikilla kuudella alkuperäisellä esimerkillä oli kolme yhteistä puutetta. chrset="UTF 8" ei ole kelvollinen attribuutti tai koodaus, ja on nyt charset="UTF-8". angular-route.js ladattu ennen angular.min.js, joka aiheuttaa moduulivirheen, eikä sitä koskaan käytetty – se on poistettu, kuten myös käyttämätön jQuery-viittaus. Tekstissä väitettiin myös arvon olevan ”AngularJS”, vaikka koodi asetti sen ”Angular JS”; teksti vastaa nyt arvoa.

lähtö:

Pienet kirjaimet AngularJS:ssä

Sekakirjainkokoisia kirjaimia sisältävä merkkijono hahmonnetaan kokonaan pienillä kirjaimilla. Päinvastainen muunnos toimii samalla tavalla.

Isot kirjaimet AngularJS:ssä

Tämä suodatin on pienten kirjainten suodattimen vastinpari, joka näyttää kaikki merkit isoilla kirjaimilla.

Alla olevassa kuvassa ohjain lähettää merkkijonon näkymään scope-objektin kautta, ja suodatin muuntaa sen isoiksi kirjaimiksi.

Isot kirjaimet AngularJS:ssä

<!-- 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 Selitys

  1. Sekakirjoitettu merkkijono ”Angular JS” sijoitetaan tutorialName ja liitetty laajuusobjektiin.
  2. Suodatinsymbolin (|) perässä on uppercase avainsana, joten sisäänrakennettu suodatin näyttää koko merkkijonon isoilla kirjaimilla.

⚠️ korjaus: Alkuperäisessä tekstissä tämä osio esiteltiin "esimerkkinä AngularJS:n isojen kirjainten suodattimesta pienten kirjainten asetuksilla", mikä on kahdesti väärin. Tässä osiossa esitellään isojen kirjainten suodatin, eikä AngularJS:ssä ole lainkaan isojen kirjainten suodatinta – vain ensimmäisen kirjaimen kirjoittaminen isolla kirjaimella vaatii mukautetun suodattimen, jonka rakentaminen näytetään myöhemmissä osioissa.

lähtö:

Isot kirjaimet AngularJS:ssä

Kirjainkokosuodattimet eivät hyväksy argumentteja. Seuraava suodatin näyttää, kuinka kaksoispiste välittää parametrin suodattimelle.

Numerosuodatin AngularJS:ssä

Tämä suodatin muotoilee luvun ja voi rajoittaa näytettävien desimaalien määrää.

Alla olevassa esimerkissä käytetään numerosuodatinta näyttämään kahden desimaalin tarkkuudella rajoitettu arvo. Ohjain lähettää numeron näkymään scope-objektin kautta, ja suodatinta käytetään näkymässä.

Numerosuodatin AngularJS:ssä

<!-- 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 Selitys

  1. Useita desimaaleja sisältävä luku sijoitetaan jäsenmuuttujaan nimeltä tutorialID ja liitetty laajuusobjektiin.
  2. Suodatinsymbolin (|) perässä on number:2Kaksoispiste välittää argumentin ja luku 2 asettaa kaksi desimaalia. Arvo pyöristetään näyttöä varten, joten 3.565656 näkyy muodossa 3.57, kun taas osoitus säilyttää koko luvun.

lähtö:

Numerosuodatin AngularJS:ssä

Pelkän numeron muotoilu ei usein riitä, kun arvo edustaa rahaa, mitä seuraava suodatin käsittelee.

Valuuttasuodatin AngularJS:ssä

Tämä suodatin muotoilee luvun valuutta-arvoksi lisäämällä siihen valuuttasymbolin, kuten $.

Alla olevassa esimerkissä ohjain lähettää numeron näkymään scope-objektin kautta ja valuuttasuodatinta käytetään näkymässä.

Valuuttasuodatin AngularJS:ssä

<!-- 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 Selitys

  1. Numero sijoitetaan jäsenmuuttujaan nimeltä tutorialprice ja liitetty laajuusobjektiin.
  2. Suodatinsymbolin (|) perässä on currency suodattaa.

⚠️ korjaus: Alkuperäisessä väitettiin, että valuutta "riippuu koneeseen käytetyistä kieliasetuksista". Se ei kuitenkaan ole. AngularJS käyttää kirjaston mukana tulevaa kieliasetusta, joka on oletuksena en-US, joten symboli on $ käyttöjärjestelmästä riippumatta. Lataa vastaava angular-locale_*.js tiedosto tai anna symboli suoraan: {{tutorialprice | currency:"£"}}.

lähtö:

Valuuttasuodatin AngularJS:ssä

Merkkijonot ja numerot ovat yksinkertaisia ​​arvoja. Viimeinen sisäänrakennettu suodatin käsittelee kokonaisia ​​objekteja.

JSON-suodatin AngularJS:ssä

Tämä suodatin muuntaa objektin muotoilluksi JSON merkkijono, joka on hyödyllinen laajuusdatan tarkastelussa kehityksen aikana.

Alla olevassa esimerkissä ohjain lähettää objektin näkymään scope-objektin kautta ja JSON-suodatinta käytetään näkymässä.

JSON-suodatin AngularJS:ssä

<!-- 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 Selitys

  1. Esine, jossa on TutorialID: 12 ja tutorialName: "Angular" sijoitetaan jäsenmuuttujaan nimeltä tutorial ja liitetty laajuusobjektiin.
  2. Suodatinsymbolin (|) perässä on json suodatin, joka sarjoittaa objektin sisennettyyn JSON-tekstiin.

⚠️ korjaus: Alkuperäisessä teoksessa tätä arvoa kuvailtiin "numeroksi" ja "JSON-tyyppiseksi merkkijonoksi". Se ei ole kumpaakaan. Se on JavaScript-objekti, ja json-suodatin muuntaa sen näytettäväksi JSON-merkkijonoksi.

lähtö:

JSON-suodatin AngularJS:ssä

Nämä viisi suodatinta kattavat yleisimmät tapaukset. Kun mikään niistä ei tuota tarvitsemaasi tulosta, kirjoitat oman.

AngularJS mukautettu suodatin

Joskus AngularJS:n sisäänrakennetut suodattimet eivät täytä tulosteen muotoiluvaatimuksia. Tällaisessa tapauksessa voidaan luoda mukautettu AngularJS-suodatin, joka palauttaa tulosteen vaaditulla tavalla.

Mukautettu suodatin rekisteröidään moduuliin, ja se toimii täsmälleen kuten sisäänrakennettu suodatin. Seuraavissa osioissa käsitellään ensin vakiosuodattimia, koska mukautettu suodatin käyttää samaa putkisyntaksia, ja näytetään sitten, miten sellainen rakennetaan.

Kuinka luoda mukautettu suodatin AngularJS: ssä

Alla olevassa esimerkissä merkkijono kulkee kohdasta ohjain näkymään laajuusobjektin kautta, mutta sitä ei pitäisi näyttää sellaisenaan. Mukautettu suodatin kohdassa angularjs lisää toisen merkkijonon ja näyttää valmiin tuloksen.

Luo mukautettu suodatin AngularJS:ssä

<!-- 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 Selitys

  1. Merkkijono ”Angular” sijoitetaan jäsenmuuttujaan nimeltä tutorial ja liitetty laajuusobjektiin.
  2. AngularJS tarjoaa filter rekisteröintimenetelmä, jota käytetään mukautetun suodattimen luomiseen. Sille annetaan nimi 'Demofilter', ja näkymä viittaa tähän nimeen.
  3. Tämä on mukautetun suodattimen vakiomuoto: rekisteröity funktio on tehdas palauttaa työn tekevän funktion. Tämä funktio saa suodatettavan arvon ensimmäiseksi parametrikseen ja palauttaa tuloksen – tässä tapauksessa syötteen, johon on liitetty ”Tutorial”.
  4. Suodatinta käytetään näkymässä samalla pystyviivasyntaksilla kuin mitä tahansa sisäänrakennettua suodatinta.

💡 Vinkki: Suodattimien nimet kirjoitetaan yleensä pienillä kirjaimilla tai camelCase-alkuperäisillä kirjaimilla. 'Demofilter' toimii, mutta nimi, kuten appendTutorial lukee paremmin ja välttää törmäykset sisäänrakennetun nimen kanssa.

lähtö:

Luo mukautettu suodatin AngularJS:ssä

Sana 'Tutorial' on lisätty annettuun merkkijonoon. tutorial muuttuja. Tämä suodatin lisää aina saman tekstin, jonka voi määrittää seuraavassa osiossa.

Argumenttien välittäminen mukautetulle suodattimelle

Yllä oleva suodatin koodaa liittämänsä tekstin kiinteästi, joten se voi tehdä vain yhden asian. Sisäänrakennetut suodattimet, kuten number:2 hyväksyy argumentin kaksoispisteen jälkeen, ja mukautettu suodatin voi myös: jokainen ensimmäisen jälkeen oleva parametri yhdistetään kaksoispisteellä erotettuun argumenttiin näkymässä.

Kolme vaihetta on mukana: lisää parametrit jälkeen input Anna palautetussa funktiossa oletusarvo kaikille valinnaisille arvoille, jotta suodatin toimii edelleen, kun argumentti jätetään pois, ja välitä sitten argumentit näkymässä kaksoispisteillä erotettuina.

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

Näkymä kuuluu sitten seuraavasti, jossa sanasta ”Tutorial” tulee suffix ja yhdysmerkistä tulee separator.

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

Kaksi yksityiskohtaa on helppo jättää huomiotta. Argumentit ovat AngularJS-lausekkeita, joten literaalimerkkijono on laitettava lainausmerkkeihin, kun taas lainausmerkeissä oleva sana luetaan scope-ominaisuutena. Suodattimet myös ketjuttavat, jolloin kukin vastaanottaa edellisen suodattimen tuotoksen: {{tutorial | appendText:"Tutorial" | uppercase}}.

⚠️ Varoitus: Pidä suodatin puhtaana — sama tuloste samalle syötteelle, ei ulkoisia muutoksia. AngularJS tallentaa puhtaan suodattimen välimuistiin ja suorittaa sen uudelleen vain, kun syöte muuttuu. Suodatin, joka lukee kellon tai muuttaa palvelun arvoa, on merkittävä. $stateful, joka poistaa välimuistin käytöstä ja suorittaa suodattimen jokaisella tiivistesyklillä, mikä on yleinen syy hitaille sivuille.

Suodattimet eivät rajoitu malleihin. Samaa suodatinta voidaan kutsua mistä tahansa JavaSkripti, kuten seuraavassa näkyy.

Suodattimien käyttö ohjaimessa $filter-palvelun avulla

Suodattimen käyttäminen näkymässä on yleinen tapa, mutta muunnettua arvoa tarvitaan joskus ohjaimen sisällä, esimerkiksi ennen datan lähettämistä palvelimelle. AngularJS näyttää kaikki rekisteröidyt suodattimet, sekä sisäänrakennetut että mukautetut, suodattimen kautta. $filter palvelu. Injektoi se, kutsu sitä suodattimen nimellä hakeaksesi suodatinfunktion ja kutsu sitten sitä arvolla ja mahdollisilla argumenteilla.

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

Lyhyempi muoto on myös olemassa: suodattimen nimen syöttäminen ja sen perään Filter, Kuten uppercaseFilter, tarjoaa suodatinfunktion suoraan ja sitä voidaan kutsua välittömästi. Molemmat muodot antavat saman funktion, joten valinta on tyylillinen.

Kaksi käyttötarkoitusta tulee toistuvasti esiin. Ensimmäinen on hyötykuorman valmistelu: päivämäärän on yleensä saavutettava API kiinteän kaavan mukaisesti, ja $filter('date')(value, 'yyyy-MM-dd') tuottaa sen koskematta lomakkeeseen sidottuun arvoon. Toinen on kokoelman rajaaminen ohjaimessa sen sijaan, että se jätettäisiin orderBy vuonna ng-toista lauseke, jossa se suoritetaan uudelleen jokaisella tiivistelmällä.

Tällä tavoin injektoidut suodattimet rekisteröidään edelleen moduuliin, joten mukautettu suodatin on määriteltävä seuraavasti: app.filter ennen kuin yksikään valvoja kysyy $filter Muuten AngularJS heittää tuntemattoman toimittajan virheen.

Suodattimen kutsuminen sisään JavaSkripti eroaa mallineesta yhdellä tärkeällä tavalla: tulos lasketaan kerran ja tallennetaan laajuusohjelmaan sen sijaan, että se laskettaisiin uudelleen jokaisella tiivisteellä. Tämä tekee siitä nopeamman vaihtoehdon arvolle, joka muuttuu harvoin, ja väärän vaihtoehdon arvolle, joka on pakko track käyttäjän syöte.

UKK

Ei. AngularJS tukee vain pieniä ja isoja kirjaimia. Kunkin sanan ensimmäisen kirjaimen kirjoittaminen isolla alkukirjaimella vaatii mukautetun suodattimen, joka jakaa merkkijonon ja muodostaa sen uudelleen, tai CSS-tekstinmuunnossäännön, jos muutos on puhtaasti visuaalinen.

Suodatin on rekisteröity eri moduuliin kuin ng-app:n käynnistämään moduuliin, tai sen määrittävä skripti suoritetaan ennen AngularJS:n latausta. Rekisteröi suodatin samaan moduuliin ja lataa kirjasto ensin.

Kyllä. Pii.ping kokoelma sisällä ng-toista suodattaa tai järjestää alkiot ennen niiden renderöintiä. Suodatin vastaanottaa koko taulukon ja sen on palautettava taulukko.

Kyllä. AI Assistantit luovat tehdasasettelun, palautetun funktion ja näkymäsyntaksin muotoilusäännön pelkästä kuvauksesta. Tarkista, että luotu suodatin suojaa määrittelemättömältä syötteeltä.

Tekoälytyökalut kirjoittavat tehtaan uudelleen luokkana, joka toteuttaa PipeTransformin, ja siirtävät jokaisen ylimääräisen parametrin transform-metodiin. RevTarkastele mitä tahansa $tilallista suodatinta käsin, koska epäpuhtaat pipetit on ilmoitettava eksplisiittisesti.

Tiivistä tämä viesti seuraavasti: