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.

  • ๐ŸŽฏ Kรคrnansvar: En kontroller fyller i scope-objektet och exponerar metoder fรถr vyn; den manipulerar inte DOM:en.
  • ๐Ÿ”— Inkoppling: Direktivet ng-controller binder en namngiven kontroller till ett element, vilket ger det elementet och dess underordnade element รฅtkomst till kontrollerns omfattning.
  • ๐Ÿ” Tvรฅvรคgsbindning: ng-model lรคnkar ett formulรคrfรคlt till en scope-egenskap, sรฅ redigeringar i vyn uppdaterar kontrollenheten och vice versa.
  • ๐Ÿงฉ Metoder: Funktioner som รคr kopplade till omfรฅnget separerar distinkta logikdelar och kan anropas direkt frรฅn vyuttryck.
  • ๐Ÿท๏ธ controllerAs-syntax: Aliasera en kontroller och binda till this tar bort tvetydighet nรคr kontrollanter รคr kapslade inuti varandra.
  • ๐Ÿ“ Separation: Att flytta kontroller till en dedikerad app.js hรฅller vylagret oberoende av logiklagret.

AngularJS-kontroller med ng-controller

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:

Fungerar med AngularJS Controller
Fungerar med AngularJS Controller
  • 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.firstName och $scope.lastName gick med. I AngularJS, en funktion definierad som en variabel รคr en metod.

Fungerar med AngularJS Controller

  • 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.

Bygg en Basic Controller i AngularJS

  1. Hรคnvisningar till Bootstrap CSS-stilmall, som anvรคnds tillsammans med Bootstrap bibliotek.
  2. En referens till AngularJS-biblioteket. Allt som gรถrs med AngularJS frรฅn och med nu lรถses frรฅn den hรคr filen.
  3. 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

Bygg en Basic Controller i AngularJS

  1. Filer delas upp i tvรฅ mappar som i alla vanliga webbapplikationer: โ€cssโ€ fรถr stilmallar och โ€libโ€ fรถr JavaScript filer.
  2. bootstrap.css finns i css-mappen och ger webbplatsen dess utseende och kรคnsla.
  3. angular.js รคr huvudbiblioteket, nedladdat frรฅn AngularJS-webbplatsen och lagrat i lib.
  4. 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.

Bygg en Basic 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 Fรถrklaring:

  1. ng-app markerar detta element som roten till en AngularJS-applikation. Attribut med prefixet ng- รคr inbyggda direktiv. โ€DemoAppโ€ รคr namnet pรฅ applikationen.
  2. Diven bรคr ng-kontroller med namnet โ€DemoControllerโ€, vilket ger det elementet och allt inuti det รฅtkomst till kontrollenhetens omfattning.
  3. ng-modell skapar modellbindningen och knyter textrutan Handledningsnamn till scope-egenskapen tutorialName.
  4. Modulen DemoApp skapas, och kontrollenheten tilldelar standardvรคrdet "AngularJS" till tutorialName.

โš ๏ธ 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:

Bygg en Basic Controller i AngularJS

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.

Definiera metoder i AngularJS-kontroller

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

  1. En funktion รคr kopplad till scope-objektet som medlemmen tNameDen returnerar det aktuella vรคrdet av tutorialName.
  2. 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:

Definiera metoder i AngularJS-kontroller

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.

AngularJS Controller med ng-Controller

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

Ovanstรฅende kod gรถr fรถljande:

  1. Definierar en modul som heter "app" som innehรฅller kontrollenheten.
  2. Skapar en kontroller med namnet "HelloWorldCtrl" som visar meddelandet "Hello World".
  3. 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.

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>

โš ๏ธ 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:

AngularJS Controller med ng-Controller

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.

Vanliga frรฅgor

Ja. AngularJS skapar en separat instans och ett separat scope fรถr varje element som bรคr direktivet. Instanserna delar inget tillstรฅnd, sรฅ en fรถrรคndring i den ena visas inte i den andra.

Deklarera det i rutten nรคr kontrollanten tillhรถr en hel vy som laddats av routingAnvรคnd ng-controller fรถr en komponent som visas inuti en sida oavsett aktuell rutt. Deklarera aldrig bรฅda, annars kรถrs kontrollanten tvรฅ gรฅnger.

Anvรคnd array-annoteringen och lista beroenden som strรคngar fรถre funktionen. Minifierare byter namn pรฅ funktionsargument men aldrig strรคngliteraler, sรฅ injektorn lรถser fortfarande $scope och eventuella tjรคnster korrekt.

Ja. AI Assistenter producerar bindningarna fรถr modul, kontrollenhet och omfรฅng frรฅn en enkel beskrivning av skรคrmen. Kontrollera alltid beroendeannoteringen, eftersom genererad kod ofta utelรคmnar den.

AI-verktyg skriver om omfรฅngstilldelningar som egenskaper pรฅ en infรฅngad virtuell maskin-variabel och prefixar varje matchande vybindning med aliaset. Revvisa $watch-anrop och hรคndelselyssnare manuellt, eftersom de fortfarande krรคver scope-objektet.

Sammanfatta detta inlรคgg med: