AngularJS kontroleri s primjerom ng-kontrolera
โก Pametni saลพetak
Kontroler u AngularJS-u sadrลพi poslovnu logiku ekrana. Prima podatke putem objekta scope, obraฤuje ih i izlaลพe rezultat natrag prikazu, ฤuvajuฤiping oznaฤavanje prezentacije osloboฤeno logike aplikacije.

ล to je Controller u AngularJS?
A kontrolor U AngularJS-u, podaci se uzimaju iz Viewa, obraฤuju i zatim ลกalju u View koji se prikazuje krajnjem korisniku. Controller sadrลพi vaลกu osnovnu poslovnu logiku. Koristi model podataka, provodi potrebnu obradu, a zatim prosljeฤuje izlaz u View.
โ ๏ธ Napomena o verziji: AngularJS (grana 1.x) dosegao je kraj svog ลพivotnog vijeka 31. prosinca 2021. i neฤe primati daljnje sigurnosne zakrpe. Koncepti u nastavku i dalje se primjenjuju na naslijeฤene aplikacije; u modernom Angularu istu ulogu ispunjava klasa komponente, a ne kontroler.
Poznavanje ลกto je kontroler ostavlja jedno pitanje otvorenim: kako on zapravo komunicira s pogledom. Sljedeฤi odjeljak odgovara na to.
ล to Controller radi iz Angularove perspektive
Slijedi jednostavna definicija rada AngularJS kontrolera:

- Primarna odgovornost kontrolora je kontrolirati podatke koji se prosljeฤuju prikazu. Opseg i pogled imaju dvosmjernu komunikaciju.
- Svojstva prikaza i dogaฤaji mogu pozivati โโfunkcije na podruฤju. Isjeฤak u nastavku prikazuje funkcija ($scope) deklarirano s kontrolerom plus interna funkcija koja vraฤa
$scope.firstNamei$scope.lastNamepridruลพio se. U AngularJS, funkcija definirana kao varijabla je Metoda.
- Podaci se prenose od kontrolera do opsega, a zatim naprijed-natrag izmeฤu opsega i pogleda.
- Opseg izlaลพe model pogledu. Model se moลพe mijenjati putem metoda definiranih na opsegu, koje se pokreฤu dogaฤajima iz pogleda.
- Kontroleri se ne bi trebali koristiti za manipuliranje DOM-om. To je posao direktive.
- Najbolja praksa je temeljiti kontrolere na funkcionalnosti. Ako imate obrazac za unos kojem je potreban kontroler, stvorite jedan pod nazivom "kontroler obrasca".
Nakon ลกto smo razumjeli mehanizam, sljedeฤi odjeljak gradi kontroler iz prazne stranice.
Kako izgraditi osnovni kontroler u AngularJS
U nastavku su navedeni koraci za izradu kontrolera u AngularJS-u.
Korak 1) Napravite osnovnu HTML stranicu
Prije izrade kontrolera, osnovna HTML stranica mora biti postavljena. Isjeฤak u nastavku je jednostavna stranica pod nazivom "Registracija dogaฤaja" koja referencira Bootstrap i AngularJS-a.
- Reference na Bootstrap CSS stilski list, koji se koristi zajedno s Bootstrap knjiลพnica.
- Referenca na AngularJS biblioteku. Sve ลกto se od sada radi s AngularJS-om izvrลกava se iz ove datoteke.
- Referenca na Bootstrap biblioteka koja ฤini odreฤene kontrole responzivnima.
โ ๏ธ Ispravak: izvorno uฤitani jQuery i navedeno da AngularJS ovisi o njemu. Ne ovisi. AngularJS dolazi s jqLiteom, ugraฤenim podskupom jQuery API-ja, i nadograฤuje se na puni jQuery samo ako se jQuery uฤita prije Referenca je uklonjena.
Korak 2) Provjerite datoteke i strukturu datoteka
- Datoteke su podijeljene u dvije mape kao u bilo kojoj konvencionalnoj web aplikaciji: โcssโ za stilske listove i โlibโ za JavaScript slika.
- bootstrap.css se nalazi u css mapi i daje stranici izgled i dojam.
- angular.js je glavna biblioteka, preuzeta s AngularJS stranice i pohranjena u lib.
- app.js ฤe sadrลพavati kod za kontrolere.
Korak 3) Koristite AngularJS kod za prikaz rezultata
Cilj je ovdje prikazati rijeฤi โAngularJSโ i kao obiฤan tekst i unutar tekstnog okvira kada se stranica otvori u pregledniku.
<!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 Objaลกnjenje:
- ng-aplikacija oznaฤava ovaj element kao korijen AngularJS aplikacije. Atributi s prefiksom ng- su ugraฤene direktive. "DemoApp" je naziv dodijeljen aplikaciji.
- Div nosi ng-kontroler s nazivom โDemoControllerโ, ลกto tom elementu i svemu unutar njega daje pristup opsegu kontrolera.
- ng-model stvara povezivanje modela, povezujuฤi tekstualni okvir Naziv tutorijala sa svojstvom opsega
tutorialName. - Modul
DemoAppse stvara, a kontroler dodjeljuje zadanu vrijednost "AngularJS"tutorialName.
โ ๏ธ Primijenjene su ispravke. Izvorni popis je deklariran chrset="UTF 8", ลกto nije ni valjani atribut ni valjani naziv kodiranja, i dva puta je uฤitao AngularJS - jednom iz CDN-a i jednom iz lib/angular.jsDvostruko uฤitavanje biblioteke ponovno registrira sustav modula i proizvodi nepredvidivo ponaลกanje. Anotacija polja ovisnosti ['$scope', function($scope){โฆ}] takoฤer je dodan, bez kojeg kontroler prekida rad u trenutku kada se datoteka minimizira.
Izlaz:
Jer tutorialName dodijeljena je vrijednost โAngularJSโ, ta se vrijednost pojavljuje u tekstnom okviru i u retku obiฤnog teksta. Jedno svojstvo je dovoljno za demonstraciju; stvarni kontroleri obiฤno takoฤer prikazuju ponaลกanje, ลกto je obuhvaฤeno sljedeฤim odjeljkom.
Kako definirati metode u AngularJS kontrolerima
Normalno bi se u kontroleru definiralo viลกe metoda za odvajanje poslovne logike. Ako bi kontroler morao dodati dva broja i podbrojtracZa dva broja, stvorili biste jednu metodu za svaku operaciju.
Primjer u nastavku definira prilagoฤenu metodu unutar AngularJS kontrolera koja vraฤa niz znakova.
<!-- 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 Objaลกnjenje:
- Funkcija je pridruลพena objektu opsega kao ฤlan
tNameVraฤa trenutnu vrijednost odtutorialName. - Pogled poziva metodu s
{{tName()}}Zagrade su vaลพne: bez njih izraz ispisuje samu funkciju, a ne njezin rezultat.
โ ๏ธ Ispravak: originalna metoda ฤitanja $scope.tName = function() { return $scope.tName; };Ta funkcija vraฤa samu sebe, a ne naziv tutorijala, pa je stranica prikazala tijelo funkcije umjesto teksta. Sada vraฤa $scope.tutorialName.
Izlaz:
Do sada je sve bilo u jednoj datoteci. Produkcijske aplikacije drลพe kontrolere odvojeno, ลกto je ono ลกto pokazuje sljedeฤi odjeljak.
AngularJS kontroler s primjerom ng-kontrolera
U gornjem primjeru "HelloWorld" sve su funkcionalnosti smjeลกtene u jednu datoteku. Sada je vrijeme da se kod kontrolera premjesti u zasebnu datoteku.
Korak 1) U datoteku app.js dodajte sljedeฤi kod za svoj kontroler.
angular.module('app', []) .controller('HelloWorldCtrl', ['$scope', function($scope) { $scope.message = "Hello World"; }]);
Gornji kod radi sljedeฤe:
- Definira modul pod nazivom "aplikacija" koji sadrลพi kontroler.
- Stvara kontroler pod nazivom โHelloWorldCtrlโ koji prikazuje poruku โPozdrav svijeteโ.
- Koristi objekt scope za prosljeฤivanje informacija iz kontrolera u pogled, u ovom sluฤaju varijablu pod nazivom
message.
Korak 2) U datoteci Sample.html dodajte div koji sadrลพi direktivu ng-controller i referencu na varijablu ฤlanicu. messageNe zaboravite referencirati app.js, koji sadrลพi izvorni kod kontrolera.
<!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>
โ ๏ธ Ispravak: app.js mora biti uฤitan nakon angular.js, buduฤi da poziva angular.moduleIzvornik je takoฤer dva puta napunio knjiลพnicu i nosio isti chrset slovoslagaฤ.
Izlaz:
Svaki primjer do sada ima svojstva ฤitanja i pisanja izravno na $scopeU donjem odjeljku opisana je alternativa koju preporuฤuje AngularJS tim.
Kako koristiti sintaksu controllerAs u AngularJS-u
Izravno vezanje na $scope radi, ali postaje dvosmisleno ฤim se kontroleri ugnijezde. Izraz prikaza kao ลกto je {{name}} ne daje pojma koji kontroler posjeduje name, a buduฤi da podreฤeni opsezi nasljeฤuju od roditeljskih opsega prototipski, ugnijeลพฤeni kontroler koji piลกe u naslijeฤeni primitiv tiho stvara vlastitu sjenu kopiju. controllerAs sintaksa uklanja oba problema davanjem svakom kontroleru pseudonima.
Korak 1) Alias โโkontrolera u pogledu pomoฤu as kljuฤnu rijeฤ, a zatim svakom povezivanju dodajte prefiks tog pseudonima.
Korak 2) Unutar kontrolera, priloลพite svojstva za this a ne $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>
Slijede tri dobitka. Veze postaju samodokumentirajuฤe, jer demo.tutorialName imenuje svog vlasnika. Ugnijeลพฤeni kontroleri prestaju se kolidirati jer je roditelj aliasiran outer i dijete s pseudonimom inner mogu li oboje izloลพiti nameVrijednosti se takoฤer veลพu kroz objekt, a ne kroz goli primitiv, zaobilazni korakping zamka gdje ureฤivanje u podreฤenom elementu nikada ne doฤe do roditelja.
๐ก Savjet: hvatanje this u varijablu kao ลกto je vm na vrhu kontrolera. Unutar povratnog poziva, this odnosi se na neลกto sasvim drugo, a snimljena referenca odrลพava povezivanje ispravnim.
Odabir stila povezivanja je jedna odluka. Odluฤiti ลกto uopฤe pripada kontroleru je druga, a usporedba u nastavku povlaฤi tu granicu.
Kontroler vs. usluga u AngularJS-u
Poฤetnici ฤesto preoptereฤuju kontroler poslom koji pripada usluzi. Razlika je u ลพivotnom vijeku i ponovnoj upotrebi: kontroler postoji samo dok je njegov prikaz na ekranu, dok je usluga singleton koji ลพivi za cijeli ลพivot aplikacije.
| Aspekt | kontrolor | Servis |
|---|---|---|
| ลฝivot | Stvoreno i uniลกteno s pogledom | Jedna instanca za cijelu aplikaciju |
| Svrha | Pripremite podatke za jedan prikaz | Zajedniฤka logika, stanje i pozivi posluลพitelja |
| Za viลกekratnu upotrebu | Ne, vezano za njegov pogled | Da, moลพe se injektirati bilo gdje |
| Zadrลพava stanje izmeฤu prikaza | Ne, stanje se gubi prilikom navigacije | Da, drลพava i dalje postoji |
| Tipiฤan sadrลพaj | Svojstva opsega i metode prikaza | HTTP pozivi, keลกiranje, poslovna pravila |
Odrลพavajte kontrolere tankima. Ako dva kontrolera trebaju istu logiku ili ako vrijednost mora preลพivjeti navigaciju izmeฤu prikaza, premjestite je u uslugu i ubrizgajte tu uslugu gdje je potrebna. Praktiฤni test je pitati bi li kod i dalje imao smisla sa zatvorenim trenutnim zaslonom. Ako je odgovor da, pripada usluzi.










