AngularJS ng-upprepa direktiv med exempel

โšก Smart sammanfattning

Direktivet ng-repeat i AngularJS renderar en kopia av ett element fรถr varje objekt i en samling som definierats i controllerns scope. Det omvandlar en array till en lista, en tabell eller nรฅgon repeterande markup utan att skriva en manuell loop.

  • ๐Ÿ” Kรคrnbeteende: ng-repeat klonar sitt vรคrdelement en gรฅng per objekt, sรฅ direktivet hรถr hemma pรฅ elementet som upprepas, inte dess container.
  • ๐Ÿท๏ธ Loopvariabel: Namnet fรถre ordet in blir ett lokalt alias fรถr det aktuella objektet inuti den klonen.
  • ๐Ÿงฌ Underordnat omfattning: Varje iteration fรฅr sitt eget underordnade scope, vilket รคr anledningen till att tilldelning av en primitiv inuti loopen inte nรฅr fรถrรคldern.
  • ๐Ÿ”‘ Identitet Tracking: A track by expression talar om fรถr AngularJS hur objekt identifieras, och det krรคvs nรคr en samling innehรฅller upprepade vรคrden.
  • ๐Ÿ”ข Inbyggda lokala funktioner: Egenskaper som $index, $first och $last รคr tillgรคngliga i varje iteration fรถr numrering och formatering.
  • โš ๏ธ Supportstatus: AngularJS nรฅdde slutet av sin livscykel den 31 december 2021 och fรฅr inga ytterligare sรคkerhetsuppdateringar.

AngularJS ng-repeat-direktivet

ng-repetera direktivet i AngularJS

Ocuco-landskapet ng-upprepa Direktiven I AngularJS anvรคnds fรถr att visa upprepade vรคrden som definierats i kontrollenheten. Ibland behรถver vi visa en lista med objekt i vyn, och ng-repeat renderar en lista som definierats i kontrollenheten pรฅ en vysida.

โš ๏ธ Supportmeddelande: AngularJS nรฅdde slut pรฅ livscykeln den 31 december 2021 och fรฅr inga ytterligare patchar eller sรคkerhetsfixar. Direktivet nedan fรถrblir korrekt fรถr underhรฅll av befintliga AngularJS 1.x-applikationer; i moderna Vinkel motsvarigheten รคr *ngFor strukturdirektiv.

AngularJS ng-repeat direktiv Exempel

Lรฅt oss titta pรฅ ett exempel pรฅ ng-repeat-direktivet i AngularJS:

ng-repetera direktivet 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 Fรถrklaring:

  1. I styrenhet, definierar vi fรถrst arrayen med listobjekt som ska visas i vyn. Hรคr en array som heter TopicNames innehรฅller tre objekt, vart och ett ett namn-vรคrde-par.
  2. Matrisen รคr direkt tilldelad $scope.TopicNames, vilket gรถr den tillgรคnglig fรถr vyn som รคr bunden till den hรคr kontrollanten.
  3. HTML-taggarna <ul> (oordnad lista) och <li> (listobjekt) visar objekten. Direktivet ng-repeat itererar รถver varje post i arrayen, och tpname รคr den lokala variabeln som innehรฅller det aktuella objektet, sรฅ {{tpname.name}} skriver ut dess namnegenskap.

โš ๏ธ Rรคttelse: Den ursprungliga fรถrklaringen angav att arrayen "lades till en medlemsvariabel som heter topics". Ingen sรฅdan variabel finns i koden โ€” arrayen tilldelas direkt till $scope.TopicNames, vilket รคr namnet som vyn refererar till. Att introducera ett andra namn hรคr รคr en vanlig orsak till en tom lista.

Om koden kรถrs korrekt visas fรถljande utdata i webblรคsaren.

ng-repetera direktivet i AngularJS

AngularJS Multiple Controllers

Tidigare sรฅg vi en enda regulator dรคr en metod hanterade bรฅde addition och subtraction av tal. Du kan istรคllet anvรคnda flera styrenheter fรถr att separera logiken tydligare. Till exempel kan en styrenhet arbeta med tal medan en annan arbetar med strรคngar.

Lรฅt oss titta pรฅ ett exempel pรฅ hur man definierar flera kontroller i en AngularJS-applikation.

AngularJS Multiple Controllers

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

  1. Tvรฅ styrenheter รคr definierade, firstcontroller och secondcontrollerVarje kopplar en variabel till sin egen omfattning: pname i det fรถrsta, lname pรฅ sekunden.
  2. I vyn รคr den andra kontrollanten kapslad inuti den fรถrsta, och uttrycket lรคser lname frรฅn det inre omfรฅnget. Eftersom en kapslad kontroller รคrver frรฅn sin fรถrรคlder, {{pname}} skulle ocksรฅ lรถsas hรคr โ€” arvet flyter nedรฅt, aldrig uppรฅt.

Om koden kรถrs korrekt, visas texten andrakontroller visas.

AngularJS Multiple Controllers

Sรฅ hรคr anvรคnder du track av med ng-upprepning

Det enskilt vanligaste ng-repeat-felet รคr felet Duplicates in a repeater are not allowedDet verkar som att i det รถgonblick en samling innehรฅller samma vรคrde tvรฅ gรฅnger, och det stoppar listrenderingen helt.

Orsaken รคr identitet trackung. AngularJS behรถver en stabil nyckel fรถr varje objekt sรฅ att den kan รฅteranvรคnda DOM-noder istรคllet fรถr att bygga om dem vid varje sammandrag. Som standard anvรคnder den sjรคlva objektvรคrdet, sรฅ tvรฅ identiska vรคrden kolliderar.

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

Att vรคlja mellan de tvรฅ formerna รคr viktigare รคn det fรถrst verkar. Tracking by $index lรถser alltid felet, eftersom en position per definition รคr unik, men den kopplar varje DOM-nod till en plats snarare รคn till en post. Om du รคndrar ordning eller filtrerar samlingen รฅteranvรคnds fel noder, vilket visas som inmatningsfรคlt keeping fรถregรฅende rads text.

Tracking med en รคkta identifierare, sรฅsom topic.id undviker det helt. AngularJS kan fรถlja varje post nรคr den flyttas, sรฅ den ordnar om befintliga noder istรคllet fรถr att fรถrstรถra och bygga om dem. Pรฅ lรฅnga listor รคr detta ocksรฅ markant snabbare, eftersom en omrendering bara berรถr de rader som faktiskt รคndrades. $index endast fรถr arrayer med vanliga vรคrden som aldrig รคndrar ordning.

Specialegenskaper tillgรคngliga inuti ng-repeat

Varje iteration av ng-repeat exponerar flera skrivskyddade egenskaper pรฅ sitt eget underordnade omfรฅng. De beskriver var det aktuella objektet finns inom samlingen, vilket tรคcker numrering, alternerande stilar och avgrรคnsare utan att lรคgga till nรฅgot extra tillstรฅnd till kontrollenheten.

Fast egendom Typ Vรคrderar
$index Antal Position fรถr aktuellt objekt, med bรถrjan vid 0
$first Boolean Sant endast fรถr den fรถrsta punkten
$last Boolean Sant endast fรถr den sista punkten
$middle Boolean Sant fรถr varje objekt som varken รคr fรถrst eller sist
$even Boolean Sant nรคr $index รคr jรคmnt
$odd Boolean Sant nรคr $index รคr udda

En typisk anvรคndning kombinerar dem med ng-klass fรถr zebrastrimmorping, som i ng-class="{'row-alt': $odd}", eller med ng-if fรถr att rendera en avgrรคnsare pรฅ varje rad utom den sista, skriven ng-if="!$last"Att visa ett lรคsbart radnummer รคr helt enkelt {{$index + 1}}, eftersom indexet รคr nollbaserat. Alla sex egenskaper berรคknas om automatiskt nรคr samlingen รคndras, sรฅ ingenting behรถver berรคknas om manuellt.

Vanliga ng-repeat-fel och hur man รฅtgรคrdar dem

De flesta ng-repeat-problem uppstรฅr pรฅ grund av duplicerade vรคrden, frรฅn arv av scope eller frรฅn att direktivet sitter pรฅ fel element. Varje symptom nedan anger dess orsak.

  • Dubbletter i en repeater รคr inte tillรฅtna: samlingen har ett upprepat vรคrde. Lรคgg till track by $index, eller bรคttre, track by en unik egendom.
  • Listan visar ingenting: Namnet i vyn matchar inte egenskapen pรฅ omfรฅnget. Skriv ut samlingen med {{TopicNames}} fรถr att bekrรคfta att den anlรคnt.
  • Varje element upprepas, inklusive omslaget: ng-repeat placerades pรฅ behรฅllaren istรคllet fรถr pรฅ objektet. Flytta den till <li> or <tr>.
  • Att redigera en inmatning รคndrar fel rad: listan รคr tracked av $index medan varorna ombestรคlls. Track med en stabil identifierare istรคllet.
  • ร„ndringar inom loopen behรฅlls inte: varje iteration har sitt eget underordnade omfรฅng, sรฅ att skriva till en primitiv skapar en lokal kopia. Skriv till en objektegenskap, till exempel item.done.

Vanliga frรฅgor

Ja, anvรคnder ng-repeat="(key, value) in myObject"Observera att AngularJS itererar objektnycklar i sorterad ordning, inte i insรคttningsordning, sรฅ en array รคr sรคkrare nรคr sekvensen spelar roll.

Kedjefilter i uttrycket, som i ng-repeat="t in TopicNames | filter:search | orderBy:'name'"Den ursprungliga arrayen รคr orรถrd; endast den renderade ordningen och delmรคngden รคndras.

Ja. AI verktygskart ng-repeat till *ngFor och track av till trackBy-funktioner. Kontrollera filtren noggrant, eftersom Angular avsiktligt tog bort det inbyggda filtret och orderBy-pipes.

AI-verktyg sรถker efter funktionsanrop inuti upprepningsuttrycket, som kรถrs igen vid varje sammandrag, och saknas track by-klausuler som tvingar fram fullstรคndiga DOM-ombyggnader. Bรฅda รคr de vanliga orsakerna till en trรถg lista.

Anvรคnd kommentarsformulรคret, ng-repeat-start och ng-repeat-end, vilket upprepar en rad syskonelement. Detta รคr viktigt i tabeller, dรคr en extra div skulle bryta uppmรคrkningen.

Sammanfatta detta inlรคgg med: