Controlere AngularJS cu ng-Controller Exemplu
โก Rezumat inteligent
Un controler รฎn AngularJS deศine logica de business a unui ecran. Primeศte date prin obiectul scope, le proceseazฤ ศi expune rezultatul รฎnapoi รฎn vizualizare.ping marcaj de prezentare fฤrฤ logicฤ de aplicaศie.

Ce este controlerul รฎn AngularJS?
A operator de date cu caracter personal, รn AngularJS, se preiau datele din View, se proceseazฤ datele ศi apoi se trimit cฤtre view, care este afiศatฤ utilizatorului final. Controllerul deศine logica de business principalฤ. Acesta foloseศte modelul de date, efectueazฤ procesarea necesarฤ ศi apoi transmite rezultatul cฤtre view.
โ ๏ธ Notฤ privind versiunea: AngularJS (ramura 1.x) a ajuns la sfรขrศitul perioadei de funcศionare pe 31 decembrie 2021 ศi nu mai primeศte alte corecศii de securitate. Conceptele de mai jos se aplicฤ รฎn continuare aplicaศiilor vechi; รฎn Angular modern, acelaศi rol este รฎndeplinit de o clasฤ de componente, mai degrabฤ decรขt de un controler.
Cunoaศterea a ceea ce este un controller lasฤ deschisฤ o รฎntrebare: cum comunicฤ acesta de fapt cu vizualizarea. Urmฤtoarea secศiune rฤspunde la aceastฤ รฎntrebare.
Ce face un controller din perspectiva Angular
Mai jos este o definiศie simplฤ a funcศionฤrii unui controller AngularJS:

- Responsabilitatea principalฤ a operatorului este de a controla datele care sunt transmise vizualizฤrii. Scopul ศi vederea au o comunicare bidirecศionalฤ.
- Proprietฤศile ศi evenimentele de vizualizare pot apela funcศii รฎn domeniul de aplicare. Fragmentul de mai jos aratฤ functie($scope) declarat cu controlerul plus o funcศie internฤ care returneazฤ
$scope.firstNameศi$scope.lastNames-a alฤturat. รn AngularJS, o funcศie definitฤ ca variabilฤ este o metodฤ.
- Datele trec de la controler la osciloscop, ศi apoi รฎnainte ศi รฎnapoi รฎntre osciloscop ศi vizualizare.
- Domeniul de aplicare expune modelul รฎn vizualizare. Modelul poate fi modificat prin metode definite รฎn domeniul de aplicare, care sunt declanศate de evenimente din vizualizare.
- Controlerele nu ar trebui folosite pentru manipularea DOM-ului. Aceasta este sarcina instrucศiuni.
- Cea mai bunฤ practicฤ este sฤ bazaศi controlerele pe funcศionalitate. Dacฤ aveศi un formular de intrare care necesitฤ un controler, creaศi unul numit โcontroler de formularโ.
Odatฤ ce mecanismul este รฎnศeles, urmฤtoarea secศiune construieศte un controller dintr-o paginฤ goalฤ.
Cum sฤ construiศi un controler de bazฤ รฎn AngularJS
Mai jos sunt paศii pentru a crea un controller รฎn AngularJS.
Pasul 1) Creaศi o paginฤ HTML de bazฤ
รnainte de a crea un controler, pagina HTML de bazฤ trebuie sฤ fie pregฤtitฤ. Fragmentul de mai jos este o paginฤ simplฤ intitulatฤ โรnregistrare evenimenteโ care face referire la Bootstrap ศi AngularJS.
- Referiri la Bootstrap Foaie de stil CSS, utilizatฤ รฎmpreunฤ cu Bootstrap bibliotecฤ.
- O referinศฤ la biblioteca AngularJS. Tot ce se va face cu AngularJS de acum รฎnainte este rezolvat din acest fiศier.
- O referire la Bootstrap bibliotecฤ, care face ca anumite controale sฤ fie receptive.
โ ๏ธ Corecลฃie: jQuery รฎncฤrcat iniศial ศi a afirmat cฤ AngularJS depinde de acesta. Nu depinde. AngularJS este livrat cu jqLite, un subset รฎncorporat al API-ului jQuery ศi face upgrade la jQuery complet doar dacฤ jQuery se รฎncarcฤ รฎnainte Referinศa a fost eliminatฤ.
Pasul 2) Verificaศi fiศierele ศi structura fiศierelor
- Fiศierele sunt รฎmpฤrศite รฎn douฤ foldere, ca รฎn orice aplicaศie web convenศionalฤ: โcssโ pentru foi de stil ศi โlibโ pentru JavaScenariu fiศiere.
- Fiศierul bootstrap.css se aflฤ รฎn folderul css ศi oferฤ site-ului aspectul ศi funcศionalitatea sa.
- angular.js este biblioteca principalฤ, descฤrcatฤ de pe site-ul AngularJS ศi pฤstratฤ รฎn lib.
- app.js va conศine codul pentru controlere.
Pasul 3) Utilizaศi codul AngularJS pentru a afiศa rezultatul
Scopul aici este de a afiศa cuvintele โAngularJSโ atรขt ca text simplu, cรขt ศi รฎntr-o casetฤ de text atunci cรขnd pagina este deschisฤ รฎn browser.
<!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 Explicaลฃie:
- ng-app marcheazฤ acest element ca rฤdฤcinฤ a unei aplicaศii AngularJS. Atributele au prefixul ng- sunt directive รฎncorporate. โDemoAppโ este numele dat aplicaศiei.
- Diviziunea poartฤ ng-controller cu numele โDemoControllerโ, care oferฤ elementului respectiv ศi tot ceea ce se aflฤ รฎn interiorul sฤu acces la domeniul de aplicare al controlerului.
- ng-model creeazฤ legฤtura modelului, legรขnd caseta de text Nume tutorial la proprietatea domeniu
tutorialName. - Modulul
DemoAppeste creat, iar controlerul atribuie o valoare implicitฤ de โAngularJSโtutorialName.
โ ๏ธ Corecศiile au fost aplicate. Listarea iniศialฤ declaratฤ chrset="UTF 8", care nu este nici un atribut valid, nici un nume de codificare valid, ศi a รฎncฤrcat AngularJS de douฤ ori โ o datฤ din CDN ศi o datฤ din lib/angular.jsรncฤrcarea bibliotecii de douฤ ori reรฎnregistreazฤ modulul de sistem ศi produce un comportament imprevizibil. Adnotarea matricei de dependenศe ['$scope', function($scope){โฆ}] a fost adฤugat ศi un cod, fฤrฤ care controlerul se รฎntrerupe รฎn momentul รฎn care fiศierul este minificat.
ieศire:
pentru cฤ tutorialName i s-a atribuit valoarea โAngularJSโ, valoarea respectivฤ apare รฎn caseta de text ศi รฎn linia de text simplu. O singurฤ proprietate este suficientฤ pentru o demonstraศie; controlerele reale expun de obicei ศi comportamentul, lucru pe care รฎl trateazฤ secศiunea urmฤtoare.
Cum sฤ definiศi metodele รฎn controlerele AngularJS
รn mod normal, s-ar defini mai multe metode รฎntr-un controler pentru a separa logica de business. Dacฤ controlerul ar trebui sฤ adauge douฤ numere ศi subtracPentru douฤ numere, aศi crea cรขte o metodฤ pentru fiecare operaศie.
Exemplul de mai jos defineศte o metodฤ personalizatฤ รฎn cadrul unui controler AngularJS care returneazฤ un ศir de caractere.
<!-- 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 Explicaลฃie:
- O funcศie este ataศatฤ obiectului de domeniu ca membru
tNameReturneazฤ valoarea curentฤ atutorialName. - Vizualizarea apeleazฤ metoda cu
{{tName()}}Parantezele conteazฤ: fฤrฤ ele, expresia afiศeazฤ funcศia รฎn sine, nu rezultatul acesteia.
โ ๏ธ Corecลฃie: metoda originalฤ cititฤ $scope.tName = function() { return $scope.tName; };Funcศia respectivฤ returneazฤ ea รฎnsฤศi, nu numele tutorialului, aศadar pagina a redat un corp al funcศiei รฎn loc de text. Acum returneazฤ $scope.tutorialName.
ieศire:
Pรขnฤ acum totul a stat รฎntr-un singur fiศier. Aplicaศiile de producศie pฤstreazฤ controlerele separate, lucru demonstrat รฎn secศiunea urmฤtoare.
Controler AngularJS cu exemplu de controler ng
Exemplul โHelloWorldโ de mai sus a plasat toate funcศionalitฤศile รฎntr-un singur fiศier. Acum este momentul sฤ mutฤm codul controlerului รฎntr-un fiศier propriu.
Pas 1) รn fiศierul app.js, adฤugaศi urmฤtorul cod pentru controlerul dvs.
angular.module('app', []) .controller('HelloWorldCtrl', ['$scope', function($scope) { $scope.message = "Hello World"; }]);
Codul de mai sus face urmฤtoarele:
- Defineศte un modul numit โappโ care deศine controlerul.
- Creeazฤ un controler numit โHelloWorldCtrlโ care afiศeazฤ mesajul โHello Worldโ.
- Foloseศte obiectul scope pentru a transmite informaศii de la controler la vizualizare, รฎn acest caz o variabilฤ numitฤ
message.
Pas 2) รn Sample.html, adฤugaศi un div care conศine directiva ng-controller ศi o referinศฤ la variabila membru. messageNu uitaศi sฤ faceศi referire la app.js, care conศine codul sursฤ al controlerului.
<!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>
โ ๏ธ Corecลฃie: app.js trebuie รฎncฤrcat dupฤ angular.js, deoarece apeleazฤ angular.moduleOriginalul a รฎncฤrcat ศi biblioteca de douฤ ori ศi a transportat acelaศi chrset greศealฤ de scriere.
ieศire:
Fiecare exemplu de pรขnฤ acum a citit ศi scris proprietฤศi direct pe $scopeSecศiunea de mai jos prezintฤ alternativa recomandatฤ de echipa AngularJS.
Cum se utilizeazฤ sintaxa controllerAs รฎn AngularJS
Legฤturฤ directฤ la $scope funcศioneazฤ, dar devine ambiguu imediat ce controlerele sunt imbricate. O expresie de vizualizare, cum ar fi {{name}} nu oferฤ nicio idee despre cine deศine controlorul nameศi, deoarece domeniile de aplicare copil moศtenesc prototipic de la domeniile de aplicare pฤrinte, un controler imbricat care scrie รฎntr-o primitivฤ moศtenitฤ รฎศi creeazฤ รฎn mod silenศios propria copie umbrฤ. controllerAs Sintaxa eliminฤ ambele probleme prin atribuirea fiecฤrui controler un alias.
Pas 1) Aliaseazฤ controlerul din vizualizare folosind as cuvรขntul cheie, apoi adฤugaศi prefixul fiecฤrei legฤturi cu acel alias.
Pas 2) รn interiorul controlerului, ataศaศi proprietฤศi la this mai degrabฤ decรขt la $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>
Urmeazฤ trei cรขศtiguri. Legฤturile devin auto-documentate, deoarece demo.tutorialName รฎศi numeศte proprietarul. Controlerele imbricate nu mai intrฤ รฎn coliziune, deoarece un pฤrinte are un alias outer ศi un copil cu alias inner pot ambele expune nameValorile se leagฤ ศi printr-un obiect, nu printr-o simplฤ primitivฤ, prin ocolire.ping capcana รฎn care o editare la un copil nu ajunge niciodatฤ la pฤrinte.
๐ Sfat: Captura this รฎntr-o variabilฤ precum vm รฎn partea de sus a controlerului. รn interiorul unui apel invers, this se referฤ la cu totul altceva, iar referinศa capturatฤ menศine legarea corectฤ.
Alegerea unui stil de legare este o decizie. A decide ce anume aparศine unui controller este o alta, iar comparaศia de mai jos traseazฤ aceastฤ linie.
Controler vs. Serviciu รฎn AngularJS
รncepฤtorii supraรฎncarcฤ frecvent controlerul cu sarcini care aparศin unui serviciu. Distincศia constฤ รฎn durata de viaศฤ ศi reutilizare: un controler existฤ doar cรขt timp vizualizarea sa este pe ecran, รฎn timp ce un serviciu este un singleton care trฤieศte pe durata de viaศฤ a aplicaศiei.
| Aspect | operator de date cu caracter personal, | Service |
|---|---|---|
| Toatฤ viaศa | Creat ศi distrus odatฤ cu vederea | O singurฤ instanศฤ pentru รฎntreaga aplicaศie |
| Scop | Pregฤtirea datelor pentru o singurฤ vizualizare | Logicฤ partajatฤ, stare ศi apeluri la server |
| Reutilizabile | Nu, legat de punctul sฤu de vedere | Da, injectabil oriunde |
| Menศine starea รฎntre vizualizฤri | Nu, starea se pierde รฎn navigare | Da, statul persistฤ |
| Conศinut tipic | Proprietฤศi de domeniu ศi metode de vizualizare | Apeluri HTTP, cache, reguli de business |
Pฤstraศi controllere subศiri. Dacฤ douฤ controllere au nevoie de aceeaศi logicฤ sau dacฤ o valoare trebuie sฤ supravieศuiascฤ navigฤrii รฎntre vizualizฤri, mutaศi-o รฎntr-un serviciu ศi injectaศi acel serviciu acolo unde este nevoie. Un test practic este sฤ รฎntrebaศi dacฤ codul ar mai avea sens chiar ศi cu ecranul curent รฎnchis. Dacฤ rฤspunsul este da, acesta รฎศi are locul รฎntr-un serviciu.










