AngularJS ng-gentag direktiv med eksempel

โšก Smart opsummering

Direktivet ng-repeat i AngularJS gengiver รฉn kopi af et element for hvert element i en samling, der er defineret i controllerens scope. Det omdanner et array til en liste, en tabel eller enhver gentagen markup uden at skrive et manuelt loop.

  • ๐Ÿ” Kerneadfรฆrd: ng-repeat kloner sit vรฆrtselement รฉn gang pr. element, sรฅ direktivet hรธrer hjemme pรฅ det element, der gentages, ikke dets container.
  • ๐Ÿท๏ธ Loopvariabel: Navnet fรธr ordet "in" bliver et lokalt alias for det aktuelle element i den klon.
  • ๐Ÿงฌ Underordnet omfang: Hver iteration modtager sit eget underordnede scope, hvilket er grunden til, at tildeling af en primitiv inde i lรธkken ikke nรฅr frem til forรฆlderen.
  • ๐Ÿ”‘ Identity Tracking: A track by expression fortรฆller AngularJS, hvordan elementer identificeres, og det er pรฅkrรฆvet, nรฅr en samling indeholder gentagne vรฆrdier.
  • ๐Ÿ”ข Indbyggede lokale: Egenskaber som $index, $first og $last er tilgรฆngelige i hver iteration til nummerering og styling.
  • โš ๏ธ Supportstatus: AngularJS nรฅede slutningen af โ€‹โ€‹sin levetid den 31. december 2021 og modtager ikke yderligere sikkerhedsrettelser.

AngularJS ng-repeat-direktiv

ng-gentagelsesdirektiv i AngularJS

ng-gentag Direktiv I AngularJS bruges til at vise gentagne vรฆrdier defineret i controlleren. Nogle gange har vi brug for at vise en liste over elementer i viewet, og ng-repeat gengiver en liste defineret i controlleren pรฅ en view-side.

โš ๏ธ Supportmeddelelse: AngularJS nรฅet levetidens afslutning den 31. december 2021 og modtager ingen yderligere programrettelser eller sikkerhedsrettelser. Direktivet nedenfor forbliver korrekt til vedligeholdelse af eksisterende AngularJS 1.x-applikationer; i moderne Vinkelforskydning det tilsvarende er *ngFor strukturdirektiv.

AngularJS ng-gentagelsesdirektiv eksempel

Lad os se pรฅ et eksempel pรฅ ng-repeat-direktivet i AngularJS:

ng-gentagelsesdirektiv 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.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 Forklaring:

  1. I controller, definerer vi fรธrst det array af listeelementer, der skal vises i visningen. Her et array kaldet TopicNames indeholder tre elementer, der hver er et navn-vรฆrdi-par.
  2. Arrayet er direkte tildelt $scope.TopicNames, hvilket gรธr den tilgรฆngelig for den visning, der er bundet til denne controller.
  3. HTML-tags <ul> (uordnet liste) og <li> (listeelement) viser elementerne. ng-repeat-direktivet gentager hver indgang i arrayet, og tpname er den lokale variabel, der indeholder det aktuelle element, sรฅ {{tpname.name}} udskriver dens navneegenskab.

โš ๏ธ Rettelse: Den oprindelige forklaring angav, at arrayet blev "tilfรธjet til en medlemsvariabel kaldet topics". En sรฅdan variabel findes ikke i koden โ€” arrayet tildeles direkte til $scope.TopicNames, som er det navn, som visningen refererer til. At introducere et andet navn her er en almindelig รฅrsag til en tom liste.

Hvis koden udfรธres korrekt, vises fรธlgende output i browseren.

ng-gentagelsesdirektiv i AngularJS

AngularJS Multiple Controllere

Tidligere sรฅ vi en enkelt controller, hvor รฉn metode hรฅndterede bรฅde addition og subtraction af tal. Du kan i stedet bruge flere controllere til at adskille logikken mere tydeligt. For eksempel kan รฉn controller arbejde pรฅ tal, mens en anden arbejder pรฅ strenge.

Lad os se pรฅ et eksempel pรฅ definition af flere controllere i en AngularJS-applikation.

AngularJS Multiple Controllere

<!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 Forklaring:

  1. To controllere er defineret, firstcontroller og secondcontrollerHver tilknytter en variabel til sin egen rรฆkkevidde: pname i den fรธrste, lname i det andet.
  2. I visningen er den anden controller indlejret i den fรธrste, og udtrykket lรฆses lname fra det indre scope. Fordi en indlejret controller arver fra sin overordnede, {{pname}} ville ogsรฅ lรธses her โ€” arv flyder nedad, aldrig opad.

Hvis koden udfรธres korrekt, vil teksten andencontroller vises.

AngularJS Multiple Controllere

Sรฅdan bruges den: track ved med ng-gentagelse

Den mest almindelige ng-repeat-fejl er fejlen Duplicates in a repeater are not allowedDet ser ud til, at i det รธjeblik en samling indeholder den samme vรฆrdi to gange, stopper det gengivelsen af โ€‹โ€‹listen helt.

ร…rsagen er identitet trackonge. AngularJS har brug for en stabil nรธgle til hvert element, sรฅ det kan genbruge DOM-noder i stedet for at genopbygge dem ved hver digest. Som standard bruger det selve elementvรฆrdien, sรฅ to identiske vรฆrdier kolliderer.

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

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

At vรฆlge mellem de to former er vigtigere end det umiddelbart ser ud til. Tracking by $index lรธser altid fejlen, fordi en position per definition er unik, men den binder hver DOM-node til et slot i stedet for til en post. Omarrangering eller filtrering af samlingen genbruger derefter de forkerte noder, hvilket vises som inputfelter, der ikke lรฆngere er tilgรฆngelige.ping den forrige rรฆkkes tekst.

Tracking ved hjรฆlp af en รฆgte identifikator, sรฅsom topic.id undgรฅr det helt. AngularJS kan fรธlge hver post, mens den bevรฆger sig, sรฅ den omarrangerer eksisterende noder i stedet for at รธdelรฆgge og genopbygge dem. Pรฅ lange lister er dette ogsรฅ markant hurtigere, da en gengivelse kun berรธrer de rรฆkker, der faktisk รฆndrede sig. Brug $index kun for arrays af almindelige vรฆrdier, der aldrig omarrangerer.

Sรฆrlige egenskaber tilgรฆngelige inde i ng-repeat

Hver iteration af ng-repeat eksponerer adskillige skrivebeskyttede egenskaber pรฅ sit eget underordnede scope. De beskriver, hvor det aktuelle element befinder sig i samlingen, hvilket dรฆkker nummerering, alternerende stilarter og separatorer uden at tilfรธje nogen ekstra tilstand til controlleren.

Ejendom Type Vรฆrdi
$index nummer Placering af det aktuelle element, startende ved 0
$first Boolesk Kun sandt for den fรธrste vare
$last Boolesk Kun sandt for den sidste vare
$middle Boolesk Sandt for alle elementer, der hverken er fรธrst eller sidst
$even Boolesk Sandt nรฅr $index er lige
$odd Boolesk Sandt nรฅr $index er ulige

En typisk anvendelse kombinerer dem med ng-klassen til zebrastriberping, som i ng-class="{'row-alt': $odd}", eller med ng-if for at gengive en separator pรฅ hver rรฆkke undtagen den sidste, skrevet ng-if="!$last"Det er simpelthen at vise et rรฆkkenummer, der kan lรฆses af mennesker {{$index + 1}}, da indekset er nulbaseret. Alle seks egenskaber genberegnes automatisk, nรฅr samlingen รฆndres, sรฅ intet behรธver at genberegnes manuelt.

Almindelige ng-repeat-fejl og hvordan man retter dem

De fleste ng-repeat-problemer stammer fra duplikerede vรฆrdier, fra arv af scope eller fra direktivet, der sidder pรฅ det forkerte element. Hvert symptom nedenfor angiver dets รฅrsag.

  • Dubletter i en repeater er ikke tilladt: Samlingen indeholder en gentaget vรฆrdi. Tilfรธj track by $index, eller bedre, track by en unik ejendom.
  • Listen viser ingenting: Navnet i visningen matcher ikke egenskaben pรฅ omfanget. Udskriv samlingen med {{TopicNames}} for at bekrรฆfte, at den er ankommet.
  • Hvert element gentages, inklusive wrapperen: ng-repeat blev placeret pรฅ beholderen i stedet for pรฅ varen. Flyt den til <li> or <tr>.
  • Redigering af et input รฆndrer den forkerte rรฆkke: listen er trackรธd af $index mens varer genbestilles. Track af en stabil identifikator i stedet.
  • ร†ndringer i lรธkken bevares ikke: Hver iteration har sit eget underordnede scope, sรฅ skrivning til en primitiv opretter en lokal kopi. Skriv til en objektegenskab, sรฅsom item.done.

Ofte Stillede Spรธrgsmรฅl

Ja, bruger ng-repeat="(key, value) in myObject"Bemรฆrk at AngularJS itererer objektnรธgler i sorteret rรฆkkefรธlge, ikke indsรฆttelsesrรฆkkefรธlge, sรฅ et array er mere sikkert, nรฅr rรฆkkefรธlgen er vigtig.

Kรฆdefiltre i udtrykket, som i ng-repeat="t in TopicNames | filter:search | orderBy:'name'"Det oprindelige array forbliver uรฆndret; kun den gengivne rรฆkkefรธlge og delmรฆngden รฆndres.

Ja. AI vรฆrktรธjer kort ng-gentag til *ngFor og track ved at trackBy-funktioner. Tjek filtrene omhyggeligt, da Angular bevidst har droppet det indbyggede filter og orderBy-pipes.

AI-vรฆrktรธjer spotter funktionskald i gentagelsesudtrykket, som kรธres igen ved hver digest, og mangler track by-klausuler, der gennemtvinger fulde DOM-genopbygninger. Begge er de sรฆdvanlige รฅrsager til en trรฆg liste.

Brug kommentarformularen, ng-repeat-start og ng-repeat-end, som gentager en rรฆkke sรธskende elementer. Dette er vigtigt i tabeller, hvor en ekstra div ville bryde markup'en.

Opsummer dette indlรฆg med: