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.

  • ๐ŸŽฏ Osnovna odgovornost: Kontroler popunjava objekt opsega i izlaลพe metode pogledu; ne manipulira DOM-om.
  • ๐Ÿ”— Oลพiฤenje: Direktiva ng-controller veลพe imenovani kontroler na element, dajuฤ‡i tom elementu i njegovim podreฤ‘enima pristup opsegu kontrolera.
  • ๐Ÿ” Dvosmjerno vezanje: ng-model povezuje polje obrasca sa svojstvom opsega, pa ureฤ‘ivanja u pogledu aลพuriraju kontroler i obrnuto.
  • ๐Ÿงฉ Metode: Funkcije pridruลพene opsegu odvajaju zasebne dijelove logike i mogu se pozvati izravno iz izraza prikaza.
  • ๐Ÿท๏ธ controllerAs sintaksa: Aliasiranje kontrolera i povezivanje s njim this uklanja dvosmislenost kada su kontroleri ugnijeลพฤ‘eni jedan u drugi.
  • ๐Ÿ“ odvajanje: Premjeลกtanje kontrolera u namjensku datoteku app.js odrลพava sloj prikaza neovisnim od logiฤkog sloja.

AngularJS kontroleri s ng-kontrolerom

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

Rad AngularJS kontrolera
Rad 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.firstName i $scope.lastName pridruลพio se. U AngularJS, funkcija definirana kao varijabla je Metoda.

Rad AngularJS kontrolera

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

Izgradite osnovni kontroler u AngularJS

  1. Reference na Bootstrap CSS stilski list, koji se koristi zajedno s Bootstrap knjiลพnica.
  2. Referenca na AngularJS biblioteku. Sve ลกto se od sada radi s AngularJS-om izvrลกava se iz ove datoteke.
  3. 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

Izgradite osnovni kontroler u AngularJS

  1. Datoteke su podijeljene u dvije mape kao u bilo kojoj konvencionalnoj web aplikaciji: โ€žcssโ€œ za stilske listove i โ€žlibโ€œ za JavaScript slika.
  2. bootstrap.css se nalazi u css mapi i daje stranici izgled i dojam.
  3. angular.js je glavna biblioteka, preuzeta s AngularJS stranice i pohranjena u lib.
  4. 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.

Izgradite osnovni kontroler u 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 Objaลกnjenje:

  1. ng-aplikacija oznaฤava ovaj element kao korijen AngularJS aplikacije. Atributi s prefiksom ng- su ugraฤ‘ene direktive. "DemoApp" je naziv dodijeljen aplikaciji.
  2. Div nosi ng-kontroler s nazivom โ€žDemoControllerโ€œ, ลกto tom elementu i svemu unutar njega daje pristup opsegu kontrolera.
  3. ng-model stvara povezivanje modela, povezujuฤ‡i tekstualni okvir Naziv tutorijala sa svojstvom opsega tutorialName.
  4. Modul DemoApp se 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:

Izgradite osnovni kontroler u AngularJS

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.

Definirajte metode u AngularJS kontrolerima

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

  1. Funkcija je pridruลพena objektu opsega kao ฤlan tNameVraฤ‡a trenutnu vrijednost od tutorialName.
  2. 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:

Definirajte metode u AngularJS kontrolerima

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.

AngularJS kontroler s ng-kontrolerom

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

Gornji kod radi sljedeฤ‡e:

  1. Definira modul pod nazivom "aplikacija" koji sadrลพi kontroler.
  2. Stvara kontroler pod nazivom โ€žHelloWorldCtrlโ€œ koji prikazuje poruku โ€žPozdrav svijeteโ€œ.
  3. 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.

AngularJS kontroler s ng-kontrolerom

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

AngularJS kontroler s ng-kontrolerom

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.

Pitanja i odgovori

Da. AngularJS stvara zasebnu instancu i zaseban opseg za svaki element koji nosi direktivu. Instance ne dijele stanje, tako da se promjena u jednoj ne pojavljuje u drugoj.

Deklarirajte ga u ruti kada kontroler pripada cijelom pogledu uฤitanom od strane usmjeravanjeKoristite ng-controller za komponentu koja se pojavljuje unutar stranice bez obzira na trenutnu rutu. Nikada ne deklarirajte oboje, inaฤe ฤ‡e se kontroler pokrenuti dvaput.

Koristite anotaciju polja, navodeฤ‡i nazive ovisnosti kao nizove znakova prije funkcije. Minifikatori preimenuju argumente funkcije, ali nikada literale nizova znakova, tako da injektor i dalje ispravno rjeลกava $scope i sve usluge.

Da. AI Asistenti izraฤ‘uju poveznice modula, kontrolera i opsega iz jednostavnog opisa zaslona. Uvijek provjerite anotaciju ovisnosti, jer je generirani kod ฤesto izostavlja.

Alati umjetne inteligencije prepisuju dodjele opsega kao svojstva snimljene varijable virtualnog stroja i svakom odgovarajuฤ‡em povezivanju prikaza dodaju alias. RevRuฤno pregledajte pozive i sluลกaฤe dogaฤ‘aja funkcije $watch, jer oni i dalje zahtijevaju objekt opsega.

Saลพmite ovu objavu uz: