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.

  • ๐ŸŽฏ Kjerneansvar: En kontroller fyller ut omfangsobjektet og eksponerer metoder for visningen; den manipulerer ikke DOM-en.
  • ๐Ÿ”— kabling: Direktivet ng-controller binder en navngitt kontroller til et element, og gir det elementet og dets underordnede tilgang til kontrollerens omfang.
  • ๐Ÿ” Toveisbinding: ng-model kobler et skjemafelt til en omfangsegenskap, slik at redigeringer i visningen oppdaterer kontrolleren og omvendt.
  • ๐Ÿงฉ Metoder: Funksjoner knyttet til omfanget skiller separate deler av logikken og kan kalles direkte fra visningsuttrykk.
  • ๐Ÿท๏ธ controllerAs-syntaks: Aliasing av en kontroller og binding til this fjerner tvetydighet nรฅr kontrollere er nestet inni hverandre.
  • ๐Ÿ“ Atskillelse: ร… flytte kontrollere til en dedikert app.js holder visningslaget uavhengig av logikklaget.

AngularJS-kontrollere med ng-controller

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:

Arbeid med AngularJS-kontrolleren
Arbeid med AngularJS-kontrolleren
  • 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.firstName og $scope.lastName ble med. Inn AngularJS, en funksjon definert som en variabel er en metode.

Arbeid med AngularJS-kontrolleren

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

Bygg en grunnleggende kontroller i AngularJS

  1. Referanser til Bootstrap CSS-stilark, brukt sammen med Bootstrap bibliotek.
  2. En referanse til AngularJS-biblioteket. Alt som gjรธres med AngularJS fra nรฅ av lรธses fra denne filen.
  3. 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

Bygg en grunnleggende kontroller i AngularJS

  1. Filene deles inn i to mapper som i alle vanlige webapplikasjoner: ยซcssยป for stilark og ยซlibยป for JavaScript filer.
  2. bootstrap.css ligger i css-mappen og gir nettstedet sitt utseende og preg.
  3. angular.js er hovedbiblioteket, lastet ned fra AngularJS-nettstedet og oppbevart i lib.
  4. 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.

Bygg en grunnleggende kontroller 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 elementet som roten til et AngularJS-program. Attributter med prefikset ng- er innebygde direktiver. ยซDemoAppยป er navnet pรฅ applikasjonen.
  2. Diven bรฆrer ng-kontroller med navnet ยซDemoControllerยป, som gir det elementet og alt i det tilgang til kontrollerens omfang.
  3. ng-modell oppretter modellbindingen, og knytter tekstboksen Opplรฆringsnavn til omfangsegenskapen tutorialName.
  4. Modulen DemoApp opprettes, og kontrolleren tildeler standardverdien ยซAngularJSยป til tutorialName.

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

Bygg en grunnleggende kontroller i AngularJS

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.

Definer metoder i AngularJS-kontrollere

<!-- 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 funksjon er knyttet til omfangsobjektet som medlemmet tNameDen returnerer gjeldende verdi av tutorialName.
  2. 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:

Definer metoder i AngularJS-kontrollere

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.

AngularJS-kontroller med ng-kontroller

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

Koden ovenfor gjรธr fรธlgende:

  1. Definerer en modul kalt ยซappยป som inneholder kontrolleren.
  2. Oppretter en kontroller kalt ยซHelloWorldCtrlยป som viser en ยซHello Worldยป-melding.
  3. 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.

AngularJS-kontroller med ng-kontroller

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

AngularJS-kontroller med ng-kontroller

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.

Spรธrsmรฅl og svar

Ja. AngularJS oppretter en separat instans og et separat omfang for hvert element som bรฆrer direktivet. Instansene deler ingen tilstand, sรฅ en endring i den ene vises ikke i den andre.

Deklarer det i ruten nรฅr kontrolleren tilhรธrer en hel visning lastet inn av rutingBruk ng-controller for en komponent som vises inne pรฅ en side uavhengig av gjeldende rute. Deklarer aldri begge, ellers kjรธrer kontrolleren to ganger.

Bruk array-annotasjonen, og oppgi avhengighetsnavn som strenger fรธr funksjonen. Minifikatorer gir nytt navn til funksjonsargumenter, men aldri strenglitteraler, slik at injektoren fortsatt lรธser $scope og eventuelle tjenester riktig.

Ja. AI Assistenter produserer modul-, kontroller- og omfangsbindingene fra en enkel beskrivelse av skjermen. Sjekk alltid avhengighetsannotasjonen, siden generert kode ofte utelater den.

AI-verktรธy omskriver omfangstildelinger som egenskaper pรฅ en registrert VM-variabel og setter aliaset foran hver samsvarende visningsbinding. Revse $watch-kall og hendelseslyttere manuelt, fordi disse fortsatt krever omfangsobjektet.

Oppsummer dette innlegget med: