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.

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:

- 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.firstNameog$scope.lastNamesluttede sig til. I AngularJS, en funktion defineret som en variabel er en metode.
- 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.
- Henvisninger til Bootstrap CSS-stylark, brugt sammen med Bootstrap bibliotek.
- En reference til AngularJS-biblioteket. Alt, der gรธres med AngularJS fremover, lรธses fra denne fil.
- 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
- Filer er opdelt i to mapper som i enhver konventionel webapplikation: "css" for stylesheets og "lib" for JavaScript filer.
- bootstrap.css ligger i css-mappen og giver webstedet dets udseende og funktionalitet.
- angular.js er hovedbiblioteket, downloadet fra AngularJS-webstedet og opbevaret i lib.
- 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.
<!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:
- ng-app markerer dette element som roden af โโen AngularJS-applikation. Attributter prรฆfikset med ng- er indbyggede direktiver. "DemoApp" er navnet pรฅ applikationen.
- Div'en bรฆrer ng-controller med navnet โDemoControllerโ, som giver elementet og alt indeni adgang til controllerens omfang.
- ng-model opretter modelbindingen og knytter tekstfeltet Tutorial Name til scope-egenskaben
tutorialName. - Modulet
DemoAppoprettes, og controlleren tildeler standardvรฆrdien โAngularJSโ tiltutorialName.
โ ๏ธ 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:
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.
<!-- 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:
- En funktion er knyttet til scope-objektet som medlemmet
tNameDen returnerer den aktuelle vรฆrdi aftutorialName. - 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:
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.
angular.module('app', []) .controller('HelloWorldCtrl', ['$scope', function($scope) { $scope.message = "Hello World"; }]);
Ovenstรฅende kode gรธr fรธlgende:
- Definerer et modul kaldet "app", som indeholder controlleren.
- Opretter en controller med navnet "HelloWorldCtrl", der viser en "Hello World"-meddelelse.
- 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.
<!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:
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.










