AngularJS Controllers med ng-Controller Exempel
โก Smart sammanfattning
En kontroller i AngularJS lagrar affรคrslogiken fรถr en skรคrm. Den tar emot data via scope-objektet, bearbetar den och visar resultatet tillbaka till vyn, keeping presentationsmarkering fri frรฅn applikationslogik.

Vad รคr Controller i AngularJS?
A Regulator I AngularJS tar den data frรฅn vyn, bearbetar den och skickar sedan den till vyn som visas fรถr slutanvรคndaren. Controllern innehรฅller din kรคrnverksamhetslogik. Den anvรคnder datamodellen, utfรถr den nรถdvรคndiga bearbetningen och skickar sedan utdata till vyn.
โ ๏ธ Versionsnotering: AngularJS (1.x-grenen) nรฅdde slutet av sin livscykel den 31 december 2021 och fรฅr inga ytterligare sรคkerhetsuppdateringar. Koncepten nedan gรคller fortfarande fรถr รคldre applikationer; i moderna Angular fylls samma roll av en komponentklass snarare รคn en kontroller.
Att veta vad en kontroller รคr lรคmnar en frรฅga รถppen: hur den faktiskt kommunicerar med vyn. Nรคsta avsnitt besvarar det.
Vad Controller gรถr frรฅn Angulars perspektiv
Fรถljande รคr en enkel definition av hur en AngularJS-kontroller fungerar:

- Den registeransvariges primรคra ansvar รคr att kontrollera de uppgifter som skickas till vyn. Omfattningen och utsikten har tvรฅvรคgskommunikation.
- Visa egenskaper och hรคndelser kan anropa funktioner pรฅ omfรฅnget. Utdraget nedan visar function($scope) deklarerad med kontrollenheten plus en intern funktion som returnerar
$scope.firstNameoch$scope.lastNamegick med. I AngularJS, en funktion definierad som en variabel รคr en metod.
- Data passerar frรฅn kontrollenheten till oscilloskopet, och sedan fram och tillbaka mellan oscilloskopet och vyn.
- Scopet exponerar modellen fรถr vyn. Modellen kan modifieras via metoder definierade fรถr scopet, vilka utlรถses av hรคndelser frรฅn vyn.
- Kontroller bรถr inte anvรคndas fรถr att manipulera DOM. Det รคr jobbet fรถr direktiv.
- Bรคsta praxis รคr att basera kontrollerna pรฅ funktionalitet. Om du har ett inmatningsformulรคr som behรถver en kontrollant, skapa en som heter "formkontrollant".
Med mekanismen fรถrstรฅtt bygger nรคsta avsnitt en kontroller frรฅn en tom sida.
Hur man bygger en grundlรคggande styrenhet i AngularJS
Nedan fรถljer stegen fรถr att skapa en kontroller i AngularJS.
Steg 1) Skapa en grundlรคggande HTML-sida
Innan en controller skapas mรฅste den grundlรคggande HTML-sidan vara pรฅ plats. Kodavsnittet nedan รคr en enkel sida med titeln "Hรคndelseregistrering" som refererar till Bootstrap och AngularJS.
- Hรคnvisningar till Bootstrap CSS-stilmall, som anvรคnds tillsammans med Bootstrap bibliotek.
- En referens till AngularJS-biblioteket. Allt som gรถrs med AngularJS frรฅn och med nu lรถses frรฅn den hรคr filen.
- En hรคnvisning till Bootstrap bibliotek, vilket gรถr vissa kontroller responsiva.
โ ๏ธ Rรคttelse: den ursprungliga inlรคsta jQuery och angav att AngularJS รคr beroende av den. Det รคr den inte. AngularJS levereras med jqLite, en inbyggd delmรคngd av jQuery API, och uppgraderas bara till fullstรคndig jQuery om jQuery laddas. innan det. Referensen har tagits bort.
Steg 2) Kontrollera filerna och filstrukturen
- Filer delas upp i tvรฅ mappar som i alla vanliga webbapplikationer: โcssโ fรถr stilmallar och โlibโ fรถr JavaScript filer.
- bootstrap.css finns i css-mappen och ger webbplatsen dess utseende och kรคnsla.
- angular.js รคr huvudbiblioteket, nedladdat frรฅn AngularJS-webbplatsen och lagrat i lib.
- app.js kommer att innehรฅlla koden fรถr kontrollerna.
Steg 3) Anvรคnd AngularJS-kod fรถr att visa utdata
Mรฅlet hรคr รคr att visa orden โAngularJSโ bรฅde som vanlig text och inuti en textruta nรคr sidan รถppnas i webblรคsaren.
<!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 Fรถrklaring:
- ng-app markerar detta element som roten till en AngularJS-applikation. Attribut med prefixet ng- รคr inbyggda direktiv. โDemoAppโ รคr namnet pรฅ applikationen.
- Diven bรคr ng-kontroller med namnet โDemoControllerโ, vilket ger det elementet och allt inuti det รฅtkomst till kontrollenhetens omfattning.
- ng-modell skapar modellbindningen och knyter textrutan Handledningsnamn till scope-egenskapen
tutorialName. - Modulen
DemoAppskapas, och kontrollenheten tilldelar standardvรคrdet "AngularJS" tilltutorialName.
โ ๏ธ Korrigeringar har tillรคmpats. Den ursprungliga listningen deklarerades chrset="UTF 8", vilket varken รคr ett giltigt attribut eller ett giltigt kodningsnamn, och laddade AngularJS tvรฅ gรฅnger โ en gรฅng frรฅn CDN och en gรฅng frรฅn lib/angular.jsAtt ladda biblioteket tvรฅ gรฅnger omregistrerar modulsystemet och producerar ofรถrutsรคgbart beteende. Annoteringen av beroendematrisen ['$scope', function($scope){โฆ}] lades ocksรฅ till, utan vilken kontrollanten bryts i det รถgonblick filen minimeras.
Produktion:
Dรคrfรถr att tutorialName tilldelades vรคrdet "AngularJS", visas det vรคrdet i textrutan och i den oformaterade textraden. En enda egenskap rรคcker fรถr en demonstration; riktiga kontroller visar vanligtvis ocksรฅ beteenden, vilket nรคsta avsnitt tar upp.
Hur man definierar metoder i AngularJS-kontroller
Normalt sett skulle man definiera flera metoder i en styrenhet fรถr att separera affรคrslogiken. Om styrenheten var tvungen att lรคgga till tvรฅ tal och subtracMed tvรฅ tal skulle du skapa en metod fรถr varje operation.
Exemplet nedan definierar en anpassad metod inuti en AngularJS-kontroller som returnerar en strรคng.
<!-- 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 Fรถrklaring:
- En funktion รคr kopplad till scope-objektet som medlemmen
tNameDen returnerar det aktuella vรคrdet avtutorialName. - Vyn anropar metoden med
{{tName()}}Parenteserna spelar roll: utan dem skriver uttrycket ut sjรคlva funktionen snarare รคn dess resultat.
โ ๏ธ Rรคttelse: den ursprungliga metoden lรคstes $scope.tName = function() { return $scope.tName; };Funktionen returnerar sig sjรคlv, inte handledningsnamnet, sรฅ sidan renderade en funktionstext istรคllet fรถr text. Den returnerar nu $scope.tutorialName.
Produktion:
Hittills har allting legat i en enda fil. Produktionsapplikationer hรฅller styrenheterna separerade, vilket nรคsta avsnitt visar.
AngularJS Controller med ng-Controller Exempel
I exemplet "HelloWorld" ovan placerades all funktionalitet i en enda fil. Det รคr nu dags att flytta kontrollkoden till en egen fil.
Steg 1) I app.js-filen lรคgger du till fรถljande kod fรถr din kontrollant.
angular.module('app', []) .controller('HelloWorldCtrl', ['$scope', function($scope) { $scope.message = "Hello World"; }]);
Ovanstรฅende kod gรถr fรถljande:
- Definierar en modul som heter "app" som innehรฅller kontrollenheten.
- Skapar en kontroller med namnet "HelloWorldCtrl" som visar meddelandet "Hello World".
- Anvรคnder scope-objektet fรถr att skicka information frรฅn kontrollenheten till vyn, i det hรคr fallet en variabel som heter
message.
Steg 2) I Sample.html, lรคgg till en div som innehรฅller ng-controller-direktivet och en referens till medlemsvariabeln messageKom ihรฅg att referera till app.js, som innehรฅller kontrollerkรคllkoden.
<!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>
โ ๏ธ Rรคttelse: app.js mรฅste laddas efter angular.js, eftersom den anropar angular.moduleOriginalet laddade ocksรฅ biblioteket tvรฅ gรฅnger och hade samma chrset stavfel.
Produktion:
Varje exempel hittills har lรคst och skrivit egenskaper direkt pรฅ $scopeAvsnittet nedan behandlar det alternativ som AngularJS-teamet rekommenderar istรคllet.
Hur man anvรคnder controllerAs-syntaxen i AngularJS
Bindande direkt till $scope fungerar, men det blir tvetydigt sรฅ snart kontrollanter รคr kapslade. Ett view-uttryck som {{name}} ger ingen aning om vilken kontrollant som รคger name, och eftersom underordnade omfattningar prototypiskt รคrver frรฅn รถverordnade omfattningar, skapar en kapslad kontroller som skriver till en รคrvd primitiv i tysthet sin egen skuggkopia. controllerAs syntaxen eliminerar bรฅda problemen genom att ge varje kontroller ett alias.
Steg 1) Alias โโfรถr kontrollenheten i vyn med hjรคlp av as nyckelordet, och lรคgg sedan till prefixet fรถr varje bindning med det aliaset.
Steg 2) Inuti kontrollenheten, koppla egenskaper till this snarare รคn att $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 vinster fรถljer. Bindningar blir sjรคlvdokumenterande, eftersom demo.tutorialName namnger sin รคgare. Kapslade kontrollanter slutar kollidera, eftersom en fรถrรคlder aliaserade outer och ett barn med alias inner kan bรฅda avslรถja nameVรคrden binder ocksรฅ genom ett objekt snarare รคn ett rent primitivt, sidostegping fรคllan dรคr en redigering i ett underordnat objekt aldrig nรฅr fรถrรคldern.
๐ Dricks: capture this in i en variabel som vm hรถgst upp pรฅ kontrollenheten. Inuti en รฅteranropning, this refererar till nรฅgot helt annat, och den infรฅngade referensen hรฅller bindningen korrekt.
Att vรคlja en bindningsstil รคr ett beslut. Att avgรถra vad som hรถr hemma i en kontroller รคr ett annat, och jรคmfรถrelsen nedan drar den grรคnsen.
Controller vs. Service i AngularJS
Nybรถrjare รถverbelastar ofta kontrollern med arbete som hรถr hemma i en tjรคnst. Skillnaden ligger i livslรคngd och รฅteranvรคndning: en kontroller existerar bara medan dess vy visas pรฅ skรคrmen, medan en tjรคnst รคr en singleton som lever under applikationens livslรคngd.
| Aspect | Regulator | Service |
|---|---|---|
| Livslรคngd | Skapad och fรถrstรถrd med utsikten | Enskild instans fรถr hela applikationen |
| Syfte | Fรถrbered data fรถr en vy | Delad logik, tillstรฅnd och serveranrop |
| ร teranvรคndbara | Nej, knuten till dess synsรคtt | Ja, injicerbar var som helst |
| Hรฅller tillstรฅnd mellan vyer | Nej, tillstรฅndet gรฅr fรถrlorat vid navigering | Ja, tillstรฅndet bestรฅr |
| Typiskt innehรฅll | Omfรฅngsegenskaper och vymetoder | HTTP-anrop, cachning, affรคrsregler |
Hรฅll kontrollerna tunna. Om tvรฅ kontrollanter behรถver samma logik, eller om ett vรคrde mรฅste รถverleva navigering mellan vyer, flytta det till en tjรคnst och injicera den tjรคnsten dรคr den behรถvs. Ett praktiskt test รคr att frรฅga om koden fortfarande skulle vara meningsfull med den aktuella skรคrmen stรคngd. Om svaret รคr ja, hรถr den hemma i en tjรคnst.










