AngularJS Controllere med ng-Controller Eksempel

โšก Smart opsummering

En controller i AngularJS indeholder forretningslogikken for en skรฆrm. Den modtager data gennem scope-objektet, behandler dem og viser resultatet tilbage til visningen.ping prรฆsentationsmarkup fri for applikationslogik.

  • ๐ŸŽฏ Kerneansvar: En controller udfylder scope-objektet og eksponerer metoder for viewet; den manipulerer ikke DOM'en.
  • ๐Ÿ”— Ledningsfรธring: ng-controller-direktivet binder en navngiven controller til et element, hvilket giver dette element og dets underordnede elementer adgang til controllerens scope.
  • ๐Ÿ” Tovejsbinding: ng-model linker et formularfelt til en scope-egenskab, sรฅ redigeringer i visningen opdaterer controlleren og omvendt.
  • ๐Ÿงฉ Metoder: Funktioner, der er knyttet til omfanget, adskiller forskellige dele af logikken og kan kaldes direkte fra visningsudtryk.
  • ๐Ÿท๏ธ controllerAs syntaks: Aliasering af en controller og binding til this fjerner tvetydighed, nรฅr controllere er indlejret i hinanden.
  • ๐Ÿ“ Adskillelse: Ved at flytte controllere til en dedikeret app.js forbliver view-laget uafhรฆngigt af logik-laget.

AngularJS-controllere med ng-controller

Hvad er controller i AngularJS?

A controller I AngularJS tager controlleren data fra visningen, behandler dataene og sender derefter disse data videre til visningen, som vises for slutbrugeren. Controlleren indeholder din kerneforretningslogik. Den bruger datamodellen, udfรธrer den nรธdvendige behandling og sender derefter outputtet til visningen.

โš ๏ธ Versionsnotat: AngularJS (1.x-grenen) nรฅede slutningen af โ€‹โ€‹sin levetid den 31. december 2021 og modtager ikke yderligere sikkerhedsrettelser. Koncepterne nedenfor gรฆlder stadig for รฆldre applikationer; i moderne Angular udfyldes den samme rolle af en komponentklasse i stedet for en controller.

Nรฅr man ved, hvad en controller er, stรฅr der รฉt spรธrgsmรฅl รฅbent: hvordan den rent faktisk kommunikerer med visningen. Det besvares i nรฆste afsnit.

Hvad en controller gรธr fra Angulars perspektiv

Fรธlgende er en simpel definition af, hvordan en AngularJS-controller fungerer:

Arbejder med AngularJS Controller
Arbejder med AngularJS Controller
  • Den dataansvarliges primรฆre ansvar er at kontrollere de data, der videregives til visningen. Omfanget og udsigten har tovejskommunikation.
  • Visningsegenskaber og hรฆndelser kan kalde funktioner pรฅ omfanget. Uddraget nedenfor viser funktion($omfang) deklareret med controlleren plus en intern funktion, der returnerer $scope.firstName og $scope.lastName sluttede sig til. I AngularJS, en funktion defineret som en variabel er en metode.

Arbejder med AngularJS Controller

  • Data passerer fra controlleren til oscilloskopet, og derefter frem og tilbage mellem oscilloskopet og visningen.
  • Scopet eksponerer modellen for viewet. Modellen kan รฆndres via metoder defineret pรฅ scopet, som udlรธses af hรฆndelser fra viewet.
  • Controllere bรธr ikke bruges til at manipulere DOM. Det er opgaven for direktiver.
  • Bedste praksis er at basere controllere pรฅ funktionalitet. Hvis du har en inputformular, der krรฆver en controller, skal du oprette en kaldet "form controller".

Nรฅr mekanismen er forstรฅet, bygger nรฆste afsnit en controller ud fra en tom side.

Sรฅdan bygger du en grundlรฆggende controller i AngularJS

Nedenfor er trinnene til at oprette en controller i AngularJS.

Trin 1) Opret en grundlรฆggende HTML-side

Fรธr en controller oprettes, skal den grundlรฆggende HTML-side vรฆre pรฅ plads. Kodestykket nedenfor er en simpel side med titlen "Begivenhedsregistrering", der refererer til Bootstrap og AngularJS.

Byg en grundlรฆggende controller i AngularJS

  1. Henvisninger til Bootstrap CSS-stylark, brugt sammen med Bootstrap bibliotek.
  2. En reference til AngularJS-biblioteket. Alt, der gรธres med AngularJS fremover, lรธses fra denne fil.
  3. En henvisning til Bootstrap bibliotek, hvilket gรธr visse kontroller responsive.

โš ๏ธ Rettelse: den oprindelige indlรฆste jQuery og angav, at AngularJS er afhรฆngig af den. Det er den ikke. AngularJS leveres med jqLite, en indbygget delmรฆngde af jQuery API'en, og opgraderes kun til fuld jQuery, hvis jQuery indlรฆses. fรธr det. Referencen er blevet fjernet.

Trin 2) Tjek filerne og filstrukturen

Byg en grundlรฆggende controller i AngularJS

  1. Filer er opdelt i to mapper som i enhver konventionel webapplikation: "css" for stylesheets og "lib" for JavaScript filer.
  2. bootstrap.css ligger i css-mappen og giver webstedet dets udseende og funktionalitet.
  3. angular.js er hovedbiblioteket, downloadet fra AngularJS-webstedet og opbevaret i lib.
  4. app.js vil indeholde koden til controllerne.

Trin 3) Brug AngularJS-kode til at vise outputtet

Mรฅlet her er at vise ordene "AngularJS" bรฅde som almindelig tekst og i en tekstboks, nรฅr siden รฅbnes i browseren.

Byg en grundlรฆggende controller i AngularJS

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Event Registration</title>
<link rel="stylesheet" href="css/bootstrap.css">
</head>
<body>
<h1> Guru99 Global Event</h1>

<div ng-app="DemoApp" ng-controller="DemoController">
Tutorial Name : <input type="text" ng-model="tutorialName"><br>
This tutorial is {{tutorialName}}
</div>

<script src="lib/angular.js"></script>
<script>
var app = angular.module('DemoApp', []);

app.controller('DemoController', ['$scope', function($scope) {
  $scope.tutorialName = "AngularJS";
}]);
</script>
</body>
</html>

Code Forklaring:

  1. ng-app markerer dette element som roden af โ€‹โ€‹en AngularJS-applikation. Attributter prรฆfikset med ng- er indbyggede direktiver. "DemoApp" er navnet pรฅ applikationen.
  2. Div'en bรฆrer ng-controller med navnet โ€œDemoControllerโ€, som giver elementet og alt indeni adgang til controllerens omfang.
  3. ng-model opretter modelbindingen og knytter tekstfeltet Tutorial Name til scope-egenskaben tutorialName.
  4. Modulet DemoApp oprettes, og controlleren tildeler standardvรฆrdien โ€œAngularJSโ€ til tutorialName.

โš ๏ธ Rettelser anvendt. Den oprindelige liste erklรฆrede chrset="UTF 8", som hverken er en gyldig attribut eller et gyldigt kodningsnavn, og indlรฆste AngularJS to gange โ€” รฉn gang fra CDN'et og รฉn gang fra lib/angular.jsHvis biblioteket indlรฆses to gange, registreres modulsystemet igen, hvilket resulterer i uforudsigelig adfรฆrd. Annotationen af โ€‹โ€‹afhรฆngighedsarrayet ['$scope', function($scope){โ€ฆ}] blev ogsรฅ tilfรธjet, uden hvilken controlleren afbrydes i det รธjeblik filen minimeres.

Output:

Byg en grundlรฆggende controller i AngularJS

Fordi tutorialName blev tildelt vรฆrdien "AngularJS", vises denne vรฆrdi i tekstboksen og i den almindelige tekstlinje. En enkelt egenskab er nok til en demonstration; rigtige controllere eksponerer normalt ogsรฅ adfรฆrd, hvilket nรฆste afsnit dรฆkker.

Sรฅdan defineres metoder i AngularJS-controllere

Normalt ville man definere flere metoder i en controller for at adskille forretningslogikken. Hvis controlleren skulle addere to tal og sub-taltracMed to tal ville du oprette รฉn metode for hver operation.

Eksemplet nedenfor definerer en brugerdefineret metode i en AngularJS-controller, der returnerer en streng.

Definer metoder i AngularJS-controllere

<!-- The head and library references are unchanged from Step 3 -->
<div ng-app="DemoApp" ng-controller="DemoController">
Tutorial Name : <input type="text" ng-model="tutorialName"><br>
This tutorial is {{tName()}}
</div>

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

app.controller('DemoController', ['$scope', function($scope) {
  $scope.tutorialName = "AngularJS";

  // A method on the scope, callable from the view as tName()
  $scope.tName = function() {
    return $scope.tutorialName;
  };
}]);
</script>

Code Forklaring:

  1. En funktion er knyttet til scope-objektet som medlemmet tNameDen returnerer den aktuelle vรฆrdi af tutorialName.
  2. Udsigten kalder metoden med {{tName()}}Parenteserne er vigtige: uden dem udskriver udtrykket selve funktionen i stedet for dens resultat.

โš ๏ธ Rettelse: den oprindelige metode lรฆst $scope.tName = function() { return $scope.tName; };Funktionen returnerer sig selv, ikke navnet pรฅ vejledningen, sรฅ siden gengivede en funktionsbrรธdtekst i stedet for tekst. Den returnerer nu $scope.tutorialName.

Output:

Definer metoder i AngularJS-controllere

Indtil videre har alting ligget i รฉn fil. Produktionsapplikationer holder controllere adskilte, hvilket er, hvad nรฆste afsnit demonstrerer.

AngularJS Controller med ng-Controller Eksempel

I eksemplet "HelloWorld" ovenfor blev al funktionalitet placeret i en enkelt fil. Det er nu tid til at flytte controllerkoden til sin egen fil.

Trin 1) I app.js-filen skal du tilfรธje fรธlgende kode til din controller.

AngularJS Controller med ng-Controller

angular.module('app', [])
  .controller('HelloWorldCtrl', ['$scope', function($scope) {
    $scope.message = "Hello World";
  }]);

Ovenstรฅende kode gรธr fรธlgende:

  1. Definerer et modul kaldet "app", som indeholder controlleren.
  2. Opretter en controller med navnet "HelloWorldCtrl", der viser en "Hello World"-meddelelse.
  3. Bruger scope-objektet til at sende information fra controlleren til viewet, i dette tilfรฆlde en variabel kaldet message.

Trin 2) I Sample.html skal du tilfรธje en div, der indeholder ng-controller-direktivet, og en reference til medlemsvariablen messageHusk at referere til app.js, som indeholder controller-kildekoden.

AngularJS Controller med ng-Controller

<!DOCTYPE html>
<html ng-app="app">
<head>
<meta charset="UTF-8">
<title>Event Registration</title>
<link rel="stylesheet" href="css/bootstrap.css">
</head>
<body>
<h1> Guru99 Global Event</h1>
<div class="container">
<div ng-controller="HelloWorldCtrl">{{message}}</div>
</div>

<script src="lib/angular.js"></script>
<script src="app.js"></script>
</body>
</html>

โš ๏ธ Rettelse: app.js skal indlรฆses efter angular.js, da den kalder angular.moduleOriginalen indlรฆste ogsรฅ biblioteket to gange og indeholdt det samme chrset tastefejl.

Output:

AngularJS Controller med ng-Controller

Alle eksempler indtil videre har lรฆst og skrevet egenskaber direkte pรฅ $scopeAfsnittet nedenfor dรฆkker det alternativ, som AngularJS-teamet anbefaler i stedet.

Sรฅdan bruger du controllerAs-syntaksen i AngularJS

Bindende direkte til $scope fungerer, men det bliver tvetydigt, sรฅ snart controllere er indlejret. Et view-udtryk som f.eks. {{name}} giver ingen anelse om, hvilken controller der ejer name, og fordi underordnede scopes prototypisk arver fra overordnede scopes, opretter en indlejret controller, der skriver til en nedarvet primitiv, lydlรธst sin egen skyggekopi. controllerAs Syntaksen fjerner begge problemer ved at give hver controller et alias.

Trin 1) Alias โ€‹โ€‹controlleren i visningen ved hjรฆlp af as nรธgleord, og giv derefter hver binding prรฆfikset med det pรฅgรฆldende alias.

Trin 2) Inde i controlleren skal du knytte egenskaber til this snarere end at $scope.

<div ng-controller="DemoController as demo">
Tutorial Name : <input type="text" ng-model="demo.tutorialName">
This tutorial is {{demo.tutorialName}}
</div>

<script>
app.controller('DemoController', function() {
  // 'vm' is captured so nested functions keep the right reference
  var vm = this;
  vm.tutorialName = "AngularJS";

  vm.tName = function() {
    return vm.tutorialName;
  };
});
</script>

Tre gevinster fรธlger. Bindinger bliver selvdokumenterende, fordi demo.tutorialName navngiver sin ejer. Indlejrede controllere stopper med at kollidere, da en forรฆlder aliaserede outer og et barn med alias inner kan begge afslรธre nameVรฆrdier binder sig ogsรฅ gennem et objekt snarere end et rent primitivt sidespring.ping fรฆlden hvor en rettelse i et barn aldrig nรฅr forรฆlderen.

๐Ÿ’ก Tip: Fange this ind i en variabel som f.eks. vm รธverst pรฅ controlleren. Inde i et tilbagekald, this refererer til noget helt andet, og den registrerede reference holder bindingen korrekt.

At vรฆlge en bindingsstil er รฉn beslutning. At afgรธre, hvad der overhovedet hรธrer hjemme i en controller, er en anden, og sammenligningen nedenfor trรฆkker den linje.

Controller vs. Service i AngularJS

Begyndere overbelaster ofte controlleren med arbejde, der hรธrer hjemme i en service. Forskellen ligger i levetid og genbrug: en controller eksisterer kun, mens dens visning er pรฅ skรฆrmen, hvorimod en service er en singleton, der lever i applikationens levetid.

Aspect controller Service
Levetid Skabt og รธdelagt med udsigten Enkelt instans for hele applikationen
Formรฅl Forbered data til รฉn visning Delt logik, tilstand og serverkald
Genanvendelig Nej, knyttet til dens synspunkt Ja, kan injiceres hvor som helst
Holder tilstand mellem visninger Nej, tilstanden gรฅr tabt under navigation Ja, staten fortsรฆtter
Typisk indhold Scope-egenskaber og visningsmetoder HTTP-kald, caching, forretningsregler

Hold controllerne slanke. Hvis to controllere har brug for den samme logik, eller hvis en vรฆrdi skal overleve navigation mellem visninger, skal den flyttes til en service og injiceres, hvor den er nรธdvendig. En praktisk test er at spรธrge, om koden stadig ville give mening med den aktuelle skรฆrm lukket. Hvis svaret er ja, hรธrer den hjemme i en service.

Ofte Stillede Spรธrgsmรฅl

Ja. AngularJS opretter en separat instans og et separat scope for hvert element, der bรฆrer direktivet. Instanserne deler ingen tilstand, sรฅ en รฆndring i den ene vises ikke i den anden.

Deklarer det i ruten, nรฅr controlleren tilhรธrer en hel visning indlรฆst af routingBrug ng-controller til en komponent, der vises pรฅ en side uanset den aktuelle rute. Deklarer aldrig begge, ellers kรธrer controlleren to gange.

Brug array-annotationen, hvor afhรฆngighedsnavne anfรธres som strenge fรธr funktionen. Minifikatorer omdรธber funktionsargumenter, men aldrig strengliteraler, sรฅ injektoren stadig lรธser $scope og eventuelle tjenester korrekt.

Ja. AI Assistenter producerer modul-, controller- og scope-bindinger ud fra en simpel beskrivelse af skรฆrmen. Kontroller altid afhรฆngighedsannotationen, da genereret kode ofte udelader den.

AI-vรฆrktรธjer omskriver omfangstildelinger som egenskaber pรฅ en registreret VM-variabel og sรฆtter aliaset foran hver matchende visningsbinding. Revse $watch-kald og eventlyttere manuelt, fordi disse stadig krรฆver scope-objektet.

Opsummer dette indlรฆg med: