AngularJS-kontrollere med ng-kontroller eksempel
โก Smart oppsummering
En kontroller i AngularJS inneholder forretningslogikken til en skjerm. Den mottar data gjennom scope-objektet, behandler dem og eksponerer resultatet tilbake til visningen, keeping presentasjonsmarkering fri for applikasjonslogikk.

Hva er kontroller i AngularJS?
A controller I AngularJS tar den dataene fra visningen, behandler dataene og sender deretter disse dataene over til visningen som vises for sluttbrukeren. Kontrolleren inneholder kjernevirksomhetslogikken din. Den bruker datamodellen, utfรธrer den nรธdvendige behandlingen og sender deretter utdataene til visningen.
โ ๏ธ Versjonsmerknad: AngularJS (1.x-grenen) nรฅdde slutten av sin levetid 31. desember 2021 og mottar ingen ytterligere sikkerhetsoppdateringer. Konseptene nedenfor gjelder fortsatt for eldre applikasjoner; i moderne Angular fylles den samme rollen av en komponentklasse i stedet for en kontroller.
Nรฅr man vet hva en kontroller er, stรฅr ett spรธrsmรฅl รฅpent: hvordan den faktisk kommuniserer med visningen. Neste avsnitt besvarer det.
Hva kontrolleren gjรธr fra Angulars perspektiv
Fรธlgende er en enkel definisjon av hvordan en AngularJS-kontroller fungerer:

- Den behandlingsansvarliges primรฆre ansvar er รฅ kontrollere dataene som sendes til visningen. Omfanget og utsikten har toveiskommunikasjon.
- Visningsegenskaper og hendelser kan kalle funksjoner pรฅ omfanget. Kodeutdraget nedenfor viser funksjon($omfang) deklarert med kontrolleren pluss en intern funksjon som returnerer
$scope.firstNameog$scope.lastNameble med. Inn AngularJS, en funksjon definert som en variabel er en metode.
- Data gรฅr fra kontrolleren til oscilloskopet, og deretter frem og tilbake mellom oscilloskopet og visningen.
- Scope eksponerer modellen for viewet. Modellen kan endres via metoder definert pรฅ scopeet, som utlรธses av hendelser fra viewet.
- Kontrollere bรธr ikke brukes til รฅ manipulere DOM. Det er jobben til direktiver.
- Beste praksis er รฅ basere kontrollere pรฅ funksjonalitet. Hvis du har et inputskjema som trenger en kontroller, opprett en som heter ยซskjemakontrollerยป.
Nรฅr mekanismen er forstรฅtt, bygger neste avsnitt en kontroller fra en tom side.
Hvordan bygge en grunnleggende kontroller i AngularJS
Nedenfor finner du trinnene for รฅ opprette en kontroller i AngularJS.
Trinn 1) Lag en grunnleggende HTML-side
Fรธr du oppretter en kontroller, mรฅ den grunnleggende HTML-siden vรฆre pรฅ plass. Kodeutdraget nedenfor er en enkel side med tittelen ยซHendelsesregistreringยป som refererer til Bootstrap og AngularJS.
- Referanser til Bootstrap CSS-stilark, brukt sammen med Bootstrap bibliotek.
- En referanse til AngularJS-biblioteket. Alt som gjรธres med AngularJS fra nรฅ av lรธses fra denne filen.
- En referanse til Bootstrap bibliotek, som gjรธr visse kontroller responsive.
โ ๏ธ Korreksjon: den opprinnelig lastede jQuery og oppga at AngularJS er avhengig av den. Det er den ikke. AngularJS leveres med jqLite, et innebygd delsett av jQuery API, og oppgraderes bare til full jQuery hvis jQuery lastes inn. fรธr du det. Referansen er fjernet.
Trinn 2) Sjekk filene og filstrukturen
- Filene deles inn i to mapper som i alle vanlige webapplikasjoner: ยซcssยป for stilark og ยซlibยป for JavaScript filer.
- bootstrap.css ligger i css-mappen og gir nettstedet sitt utseende og preg.
- angular.js er hovedbiblioteket, lastet ned fra AngularJS-nettstedet og oppbevart i lib.
- app.js vil inneholde koden for kontrollerne.
Trinn 3) Bruk AngularJS-koden for รฅ vise utdataene
Mรฅlet her er รฅ vise ordene ยซAngularJSยป bรฅde som ren tekst og i en tekstboks nรฅr siden รฅpnes i nettleseren.
<!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 elementet som roten til et AngularJS-program. Attributter med prefikset ng- er innebygde direktiver. ยซDemoAppยป er navnet pรฅ applikasjonen.
- Diven bรฆrer ng-kontroller med navnet ยซDemoControllerยป, som gir det elementet og alt i det tilgang til kontrollerens omfang.
- ng-modell oppretter modellbindingen, og knytter tekstboksen Opplรฆringsnavn til omfangsegenskapen
tutorialName. - Modulen
DemoAppopprettes, og kontrolleren tildeler standardverdien ยซAngularJSยป tiltutorialName.
โ ๏ธ Rettelser er iverksatt. Den opprinnelige oppfรธringen erklรฆrte chrset="UTF 8", som verken er et gyldig attributt eller et gyldig kodingsnavn, og lastet inn AngularJS to ganger โ รฉn gang fra CDN-et og รฉn gang fra lib/angular.jsHvis du laster biblioteket to ganger, registreres modulsystemet pรฅ nytt og det fรธrer til uforutsigbar oppfรธrsel. Avhengighetsmatriseannotasjonen ['$scope', function($scope){โฆ}] ble ogsรฅ lagt til, uten hvilken kontrolleren brytes i det รธyeblikket filen minimeres.
Utgang:
Fordi tutorialName ble tildelt verdien ยซAngularJSยป, vises den verdien i tekstboksen og i ren tekstlinje. รn enkelt egenskap er nok for en demonstrasjon; ekte kontrollere eksponerer vanligvis ogsรฅ atferd, noe neste avsnitt dekker.
Hvordan definere metoder i AngularJS-kontrollere
Normalt ville man definere flere metoder i en kontroller for รฅ separere forretningslogikken. Hvis kontrolleren mรฅtte legge sammen to tall og sub-talltracMed to tall, ville du opprette รฉn metode for hver operasjon.
Eksemplet nedenfor definerer en tilpasset metode i en AngularJS-kontroller som 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 funksjon er knyttet til omfangsobjektet som medlemmet
tNameDen returnerer gjeldende verdi avtutorialName. - Visningen kaller metoden med
{{tName()}}Parentesene er viktige: uten dem skriver uttrykket selve funksjonen i stedet for resultatet.
โ ๏ธ Korreksjon: den opprinnelige metoden lest $scope.tName = function() { return $scope.tName; };. Funksjonen returnerer seg selv, ikke navnet pรฅ veiledningen, sรฅ siden gjenga en funksjonsbrรธdtekst i stedet for tekst. Den returnerer nรฅ $scope.tutorialName.
Utgang:
Sรฅ langt har alt ligget i รฉn fil. Produksjonsapplikasjoner holder kontrollere separate, noe som er det neste avsnitt demonstrerer.
AngularJS Controller med ng-Controller Eksempel
I eksemplet ยซHelloWorldยป ovenfor ble all funksjonalitet plassert i รฉn fil. Det er nรฅ pรฅ tide รฅ flytte kontrollerkoden til en egen fil.
Trinn 1) I app.js-filen legger du til fรธlgende kode for kontrolleren din.
angular.module('app', []) .controller('HelloWorldCtrl', ['$scope', function($scope) { $scope.message = "Hello World"; }]);
Koden ovenfor gjรธr fรธlgende:
- Definerer en modul kalt ยซappยป som inneholder kontrolleren.
- Oppretter en kontroller kalt ยซHelloWorldCtrlยป som viser en ยซHello Worldยป-melding.
- Bruker scope-objektet til รฅ sende informasjon fra kontrolleren til visningen, i dette tilfellet en variabel kalt
message.
Trinn 2) I Sample.html, legg til en div som inneholder ng-controller-direktivet og en referanse til medlemsvariabelen. messageHusk รฅ referere til app.js, som inneholder kildekoden til kontrolleren.
<!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>
โ ๏ธ Korreksjon: app.js mรฅ lastes inn etter angular.js, siden den kaller angular.moduleOriginalen lastet ogsรฅ biblioteket to ganger og hadde det samme chrset skrivefeil.
Utgang:
Alle eksempler sรฅ langt har lest og skrevet egenskaper direkte pรฅ $scopeAvsnittet nedenfor dekker alternativet som AngularJS-teamet anbefaler i stedet.
Slik bruker du controllerAs-syntaksen i AngularJS
Bindende direkte til $scope fungerer, men det blir tvetydig sรฅ snart kontrollere er nestet. Et visningsuttrykk som {{name}} gir ingen anelse om hvilken kontrollรธr som eier name, og fordi underordnede omfang arver prototypisk fra overordnede omfang, oppretter en nestet kontroller som skriver til en arvet primitiv i stillhet sin egen skyggekopi. controllerAs syntaks fjerner begge problemene ved รฅ gi hver kontroller et alias.
Trinn 1) Alias โโkontrolleren i visningen ved hjelp av as nรธkkelordet, og sett deretter det aliaset foran hver binding.
Trinn 2) Inne i kontrolleren, knytt egenskaper til this heller enn รฅ $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 blir selvdokumenterende, fordi demo.tutorialName navngir eieren. Nestede kontrollere slutter รฅ kollidere, siden en overordnet alias outer og et barn med alias inner kan begge eksponere nameVerdier binder seg ogsรฅ gjennom et objekt snarere enn et rent primitivt sidesteg.ping fellen der en redigering i et barn aldri nรฅr den overordnede.
๐ Tips: Capture this inn i en variabel som vm รธverst pรฅ kontrolleren. Inne i et tilbakeringing, this refererer til noe helt annet, og den innfangede referansen holder bindingen riktig.
ร velge en bindingsstil er รฉn avgjรธrelse. ร bestemme hva som i det hele tatt hรธrer hjemme i en kontroller er en annen, og sammenligningen nedenfor trekker den grensen.
Kontroller vs. tjeneste i AngularJS
Nybegynnere overbelaster ofte kontrolleren med arbeid som hรธrer hjemme i en tjeneste. Forskjellen er levetid og gjenbruk: en kontroller eksisterer bare mens visningen er pรฅ skjermen, mens en tjeneste er en singleton som lever for applikasjonens levetid.
| Aspekt | controller | Service |
|---|---|---|
| Lifetime | Skapt og รธdelagt med utsikten | Enkeltstรฅende instans for hele applikasjonen |
| Formรฅl | Klargjรธr data for รฉn visning | Delt logikk, tilstand og serverkall |
| Gjenbruk | Nei, knyttet til synspunktet | Ja, injiserbar hvor som helst |
| Holder tilstand mellom visninger | Nei, tilstanden gรฅr tapt under navigasjon | Ja, staten vedvarer |
| Typisk innhold | Omfangsegenskaper og visningsmetoder | HTTP-kall, mellomlagring, forretningsregler |
Hold kontrollerne tynne. Hvis to kontrollere trenger samme logikk, eller hvis en verdi mรฅ overleve navigering mellom visninger, flytt den inn i en tjeneste og injiser den tjenesten der den trengs. En praktisk test er รฅ spรธrre om koden fortsatt ville gi mening med den gjeldende skjermen lukket. Hvis svaret er ja, hรธrer den hjemme i en tjeneste.










