AngularJS ng-repeat -direktiivi esimerkin kanssa

โšก ร„lykรคs yhteenveto

AngularJS:n ng-repeat-direktiivi renderรถi yhden kopion elementistรค jokaista ohjainalueella mรครคritellyn kokoelman alkiota kohden. Se muuntaa taulukon listaksi, taulukoksi tai miksi tahansa toistuvaksi merkinnรคksi ilman manuaalisen silmukan kirjoittamista.

  • ๐Ÿ” Ydinkรคyttรคytyminen: ng-repeat kloonaa isรคntรคelementtinsรค kerran alkiota kohden, joten direktiivi kuuluu toistettavaan elementtiin, ei sen sรคiliรถรถn.
  • ๐Ÿท๏ธ Silmukkamuuttuja: Sanan "in" edessรค olevasta nimestรค tulee kloonin sisรคllรค olevan nykyisen kohteen paikallinen alias.
  • ๐Ÿงฌ Lapsen laajuus: Jokainen iteraatio saa oman lapsi-ilmiรถn, minkรค vuoksi silmukan sisรคllรค olevan primitiivin osoittaminen ei yllรค vanhempaan.
  • ๐Ÿ”‘ Identiteetti Tracking: A track-lauseke kertoo AngularJS:lle, miten alkiot tunnistetaan, ja se vaaditaan, kun kokoelma sisรคltรครค toistuvia arvoja.
  • ๐Ÿ”ข Sisรครคnrakennetut paikalliset: Ominaisuudet, kuten $index, $first ja $last, ovat kรคytettรคvissรค kunkin iteraation sisรคllรค numerointia ja tyyliรค varten.
  • โš ๏ธ Tuen tila: AngularJS:n elinkaari pรครคttyi 31. joulukuuta 2021, eikรค sille ole enรครค saatavilla tietoturvapรคivityksiรค.

AngularJS ng-toistodirektiivi

ng-repeat-direktiivi AngularJS:ssรค

ng-toista Direktiivi AngularJS:ssรค kรคytetรครคn nรคyttรคmรครคn ohjaimessa mรครคriteltyjรค toistuvia arvoja. Joskus meidรคn on nรคytettรคvรค luettelo kohteista nรคkymรคssรค, ja ng-repeat renderรถi ohjaimessa mรครคritellyn luettelon nรคkymรคsivulle.

โš ๏ธ Tukitiedote: AngularJS saavutettu kรคyttรถiรคn pรครคttyessรค 31. joulukuuta 2021 eikรค saa enรครค korjauksia tai tietoturvakorjauksia. Alla oleva direktiivi pysyy paikkansa olemassa olevien AngularJS 1.x -sovellusten yllรคpidossa; nykyaikaisissa Kulma- vastaava on *ngFor rakenteellinen direktiivi.

Esimerkki AngularJS ng-repeat -direktiivistรค

Katsotaanpa esimerkkiรค ng-repeat-direktiivistรค AngularJS:ssรค:

ng-repeat-direktiivi 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.8.3/angular.js"></script>

<div ng-app="DemoApp" ng-controller="DemoController">
    <h1>Topics</h1>
    <ul>
        <li ng-repeat="tpname in TopicNames">
            {{tpname.name}}
        </li>
    </ul>
</div>

<script>
    var app = angular.module('DemoApp', []);

    app.controller('DemoController', function($scope) {
        $scope.TopicNames = [
            { name: "What controllers do from Angular's perspective" },
            { name: "Controller Methods" },
            { name: "Building a basic controller" }
        ];
    });
</script>

</body>
</html>

Code Selitys:

  1. In ohjain, mรครคrittelemme ensin nรคkymรคssรค nรคytettรคvien listakohteiden taulukon. Tรคssรค taulukko nimeltรค TopicNames sisรคltรครค kolme alkiota, joista jokainen on nimi-arvo-pari.
  2. Taulukko on osoitettu suoraan $scope.TopicNames, mikรค tekee sen saataville tรคhรคn ohjaimeen sidotulle nรคkymรคlle.
  3. HTML-tagit <ul> (jรคrjestรคmรคtรถn lista) ja <li> (luettelokohta) nรคyttรครค kohteet. ng-repeat-direktiivi kรคy lรคpi jokaisen taulukon merkinnรคn ja tpname on paikallinen muuttuja, joka sisรคltรครค nykyisen alkion, joten {{tpname.name}} tulostaa nimiominaisuuden.

โš ๏ธ Korjaus: alkuperรคisessรค selityksessรค todettiin, ettรค taulukko "lisรคttiin jรคsenmuuttujaan nimeltรค topics". Koodiin ei sisรคlly tรคllaista muuttujaa โ€” taulukkoon arvo annetaan suoraan $scope.TopicNames, joka on nimi, johon nรคkymรค viittaa. Toisen nimen lisรครคminen tรคhรคn on yleinen syy tyhjรครคn listaan.

Jos koodi suoritetaan onnistuneesti, selaimessa nรคkyy seuraava tuloste.

ng-repeat-direktiivi AngularJS:ssรค

AngularJS useita ohjaimia

Aiemmin nรคimme yhden ohjaimen, jossa yksi metodi kรคsitteli sekรค yhteenlaskun ettรค osalaskuntracnumeroiden erottaminen. Voit sen sijaan kรคyttรครค useita ohjaimia logiikan erottamiseksi selkeรคmmin. Esimerkiksi yksi ohjain voi kรคsitellรค numeroita, kun taas toinen kรคsittelee merkkijonoja.

Katsotaanpa esimerkkiรค useiden ohjainten mรครคrittelystรค AngularJS-sovelluksessa.

AngularJS useita ohjaimia

<!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.8.3/angular.js"></script>

<div ng-app="DemoApp">
    <div ng-controller="firstcontroller">
        <div ng-controller="secondcontroller">
            {{lname}}
        </div>
    </div>
</div>

<script>
    var app = angular.module('DemoApp', []);

    app.controller('firstcontroller', function($scope) {
        $scope.pname = "firstcontroller";
    });

    app.controller('secondcontroller', function($scope) {
        $scope.lname = "secondcontroller";
    });
</script>

</body>
</html>

Code Selitys:

  1. Kaksi ohjainta on mรครคritelty, firstcontroller ja secondcontrollerJokainen liittรครค muuttujan omaan laajuus: pname ensimmรคisessรค, lname toisessa.
  2. Nรคkymรคssรค toinen ohjain on ensimmรคisen sisรคllรค ja lauseke lukee lname sisemmรคstรค laajuusalueesta. Koska sisรคkkรคinen ohjain perii vanhemmalta, {{pname}} ratkeaisi myรถs tรคssรค โ€” perintรถ virtaa alaspรคin, ei koskaan ylรถspรคin.

Jos koodi suoritetaan onnistuneesti, teksti toinen ohjain nรคytetรครคn.

AngularJS useita ohjaimia

Kuinka kรคyttรครค track by ng-toistolla

Yleisin ng-toiston epรคonnistuminen on virhe Duplicates in a repeater are not allowedSe ilmestyy heti, kun kokoelma sisรคltรครค saman arvon kahdesti, ja se pysรคyttรครค listan renderรถinnin kokonaan.

Syynรค on identiteetti trackuningas. AngularJS tarvitsee vakaan avaimen jokaiselle alkiolle, jotta se voi kรคyttรครค DOM-solmuja uudelleen sen sijaan, ettรค se rakentaisi ne uudelleen jokaisella tiivisteellรค. Oletusarvoisesti se kรคyttรครค itse alkion arvoa, joten kaksi identtistรค arvoa tรถrmรครคvรคt.

<!-- Fails: the value 2 appears twice -->
<li ng-repeat="n in [1, 2, 2, 3]">{{n}}</li>

<!-- Works: position is unique even when values repeat -->
<li ng-repeat="n in [1, 2, 2, 3] track by $index">{{n}}</li>

<!-- Best for records from a server: track by a real identifier -->
<li ng-repeat="topic in TopicNames track by topic.id">{{topic.name}}</li>

Valinta nรคiden kahden muodon vรคlillรค on tรคrkeรคmpi kuin miltรค se ensi silmรคyksellรค nรคyttรครค. Tracking by $index ratkaisee aina virheen, koska sijainti on mรครคritelmรคn mukaan yksilรถllinen, mutta se sitoo jokaisen DOM-solmun paikkaan tietueen sijaan. Kokoelman uudelleenjรคrjestely tai suodattaminen kรคyttรครค sitten uudelleen vรครคriรค solmuja, jotka nรคkyvรคt syรถttรถkenttinรค, jotka sรคilyvรคtping edellisen rivin teksti.

Tracking aidolla tunnisteella, kuten topic.id vรคlttรครค sen kokonaan. AngularJS voi seurata kutakin tietuetta sen liikkuessa, joten se jรคrjestรครค olemassa olevat solmut uudelleen sen sijaan, ettรค se tuhoaisi ja rakentaisi ne uudelleen. Pitkillรค listoilla tรคmรค on myรถs huomattavasti nopeampaa, koska uudelleenrenderรถinti koskee vain rivejรค, jotka todella muuttuivat. Kรคytรค $index vain yksinkertaisten arvojen taulukoille, jotka eivรคt koskaan jรคrjesty uudelleen.

ng-repeat-funktion sisรคllรค kรคytettรคvissรค olevat erikoisominaisuudet

Jokainen ng-repeat-funktion iteraatio paljastaa useita vain luku -tilassa olevia ominaisuuksia omassa aliosiossa. Ne kuvaavat nykyisen alkion sijaintia kokoelmassa, mikรค kattaa numeroinnin, vuorottelevat tyylit ja erottimet lisรครคmรคttรค ohjaimeen mitรครคn ylimรครคrรคistรค tilaa.

Omaisuus Tyyppi Arvo
$index numero Nykyisen kohteen sijainti alkaen kohdasta 0
$first boolean Totta vain ensimmรคiselle esineelle
$last boolean Totta vain viimeiselle kohdalle
$middle boolean Totta jokaiselle esineelle, joka ei ole ensimmรคinen eikรค viimeinen
$even boolean Totta, kun $index on parillinen
$odd boolean Tosi, kun $index on pariton

Tyypillinen kรคyttรถ yhdistรครค ne ng-luokan kanssa seepra-striisien tekemiseen.ping, kuten ng-class="{'row-alt': $odd}", tai ng-if-funktiolla erotinmerkin hahmontamiseksi jokaisella rivillรค paitsi viimeisellรค, kirjoitettuna ng-if="!$last"Ihmisen luettavan rivinumeron nรคyttรคminen on yksinkertaisesti {{$index + 1}}, koska indeksi on nollapohjainen. Kaikki kuusi ominaisuutta lasketaan automaattisesti uudelleen aina, kun kokoelma muuttuu, joten mitรครคn ei tarvitse laskea uudelleen kรคsin.

Yleisiรค ng-repeat-virheitรค ja niiden korjaaminen

Useimmat ng-toisto-ongelmat johtuvat kaksoisarvoista, laajuusperiytymisestรค tai vรครคrรคllรค elementillรค olevasta direktiivistรค. Jokainen alla oleva oire nimeรครค syynsรค.

  • Toistimessa olevat kaksoiskappaleet eivรคt ole sallittuja: kokoelma sisรคltรครค toistuvan arvon. Lisรครค track by $index, tai parempi, track by ainutlaatuinen ominaisuus.
  • Lista ei anna mitรครคn selvรครค: nรคkymรคn nimi ei vastaa laajuusalueen ominaisuutta. Tulosta kokoelma kรคyttรคmรคllรค {{TopicNames}} vahvistamaan sen saapumisen.
  • Jokainen elementti toistuu, mukaan lukien kรครคre: ng-repeat sijoitettiin sรคiliรถรถn eikรค esineeseen. Siirrรค se <li> or <tr>.
  • Syรถtteen muokkaaminen muuttaa vรครคrรครค riviรค: lista on tracked by $index samalla kun esineet jรคrjestyvรคt uudelleen. Track vakaan tunnisteen avulla.
  • Silmukan sisรคllรค olevat muutokset eivรคt sรคily: Jokaisella iteraatiolla on oma lapsilaajuus, joten primitiiviin kirjoittaminen luo paikallisen kopion. Kirjoita objektin ominaisuuteen, kuten item.done.

UKK

Kyllรค, kรคyttรครค ng-repeat="(key, value) in myObject"Huomaa, ettรค AngularJS iteroi objektiavaimet lajitellussa jรคrjestyksessรค, ei lisรคysjรคrjestyksessรค, joten taulukko on turvallisempi, kun jรคrjestyksellรค on merkitystรค.

Ketjusuodattimet lausekkeessa, kuten kohdassa ng-repeat="t in TopicNames | filter:search | orderBy:'name'"Alkuperรคistรค taulukkoa ei muuteta; vain renderรถity jรคrjestys ja osajoukko muuttuvat.

Kyllรค. AI tyรถkalut yhdistรคvรคt ng-repeat-funktion *ngFor ja track mennessรค kohteeseen trackBy-funktiot. Tarkista suodattimet huolellisesti, koska Angular poisti tarkoituksella sisรครคnrakennetun suodattimen ja orderBy-pipe-funktiot.

Tekoรคlytyรถkalut havaitsevat funktiokutsuja toistolausekkeen sisรคllรค, jotka suoritetaan uudelleen jokaisella tiivisteellรค, ja puuttuvia track lausekkeilla, jotka pakottavat tรคydelliset DOM-uudelleenrakennukset. Molemmat ovat tavanomaisia โ€‹โ€‹syitรค hitaalle listalle.

Kรคytรค kommenttilomaketta, ng-repeat-start ja ng-repeat-end, joka toistaa useita sisaruselementtejรค. Tรคllรค on merkitystรค taulukoissa, joissa ylimรครคrรคinen div-elementti rikkoisi merkinnรคn.

Tiivistรค tรคmรค viesti seuraavasti: