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.

  • ๐ŸŽฏ Responsabilitate principalฤƒ: Un controler populeazฤƒ obiectul scope ศ™i expune metodele view-ului; nu manipuleazฤƒ DOM-ul.
  • ๐Ÿ”— Cabluri: Directiva ng-controller leagฤƒ un controler numit de un element, oferind acelui element ศ™i copiilor sฤƒi acces la domeniul de aplicare al controlerului.
  • ๐Ÿ” Legare bidirecศ›ionalฤƒ: ng-model leagฤƒ un cรขmp de formular de o proprietate scope, astfel รฎncรขt modificฤƒrile din vizualizare actualizeazฤƒ controlerul ศ™i invers.
  • ๐Ÿงฉ Metode: Funcศ›iile ataศ™ate domeniului de aplicare separฤƒ pฤƒrศ›i distincte de logicฤƒ ศ™i pot fi apelate direct din expresiile de vizualizare.
  • ๐Ÿท๏ธ Sintaxฤƒ controllerAs: Aliasarea unui controler ศ™i legarea la this eliminฤƒ ambiguitatea atunci cรขnd controlerele sunt imbricate unele รฎn altele.
  • ๐Ÿ“ Separare: Mutarea controlerelor รฎntr-un fiศ™ier app.js dedicat menศ›ine stratul de vizualizare independent de stratul logic.

Controlere AngularJS cu ng-controller

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:

Funcศ›ionarea controlerului AngularJS
Funcศ›ionarea controlerului 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.lastName s-a alฤƒturat. รŽn AngularJS, o funcศ›ie definitฤƒ ca variabilฤƒ este o metodฤƒ.

Funcศ›ionarea controlerului AngularJS

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

Construiศ›i un controler de bazฤƒ รฎn AngularJS

  1. Referiri la Bootstrap Foaie de stil CSS, utilizatฤƒ รฎmpreunฤƒ cu Bootstrap bibliotecฤƒ.
  2. O referinศ›ฤƒ la biblioteca AngularJS. Tot ce se va face cu AngularJS de acum รฎnainte este rezolvat din acest fiศ™ier.
  3. 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

Construiศ›i un controler de bazฤƒ รฎn AngularJS

  1. 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.
  2. Fiศ™ierul bootstrap.css se aflฤƒ รฎn folderul css ศ™i oferฤƒ site-ului aspectul ศ™i funcศ›ionalitatea sa.
  3. angular.js este biblioteca principalฤƒ, descฤƒrcatฤƒ de pe site-ul AngularJS ศ™i pฤƒstratฤƒ รฎn lib.
  4. 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.

Construiศ›i un controler de bazฤƒ รฎn 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 Explicaลฃie:

  1. 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.
  2. 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.
  3. ng-model creeazฤƒ legฤƒtura modelului, legรขnd caseta de text Nume tutorial la proprietatea domeniu tutorialName.
  4. Modulul DemoApp este 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:

Construiศ›i un controler de bazฤƒ รฎn AngularJS

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.

Definiศ›i metode รฎn controlerele AngularJS

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

  1. O funcศ›ie este ataศ™atฤƒ obiectului de domeniu ca membru tNameReturneazฤƒ valoarea curentฤƒ a tutorialName.
  2. 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:

Definiศ›i metode รฎn controlerele AngularJS

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.

Controler AngularJS cu ng-Controller

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

Codul de mai sus face urmฤƒtoarele:

  1. Defineศ™te un modul numit โ€žappโ€ care deศ›ine controlerul.
  2. Creeazฤƒ un controler numit โ€žHelloWorldCtrlโ€ care afiศ™eazฤƒ mesajul โ€žHello Worldโ€.
  3. 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.

Controler AngularJS cu 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>

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

Controler AngularJS cu ng-Controller

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.

รŽntrebฤƒri frecvente

Da. AngularJS creeazฤƒ o instanศ›ฤƒ separatฤƒ ศ™i un domeniu de aplicare separat pentru fiecare element care poartฤƒ directiva. Instanศ›ele nu au nicio stare comunฤƒ, deci o modificare a uneia nu apare รฎn cealaltฤƒ.

Declarฤƒ-l รฎn rutฤƒ atunci cรขnd controlerul aparศ›ine unei view-uri complete รฎncฤƒrcate de rutareFoloseศ™te ng-controller pentru o componentฤƒ care apare รฎn interiorul unei pagini, indiferent de ruta curentฤƒ. Nu le declari niciodatฤƒ pe amรขndouฤƒ, altfel controllerul va rula de douฤƒ ori.

Foloseศ™te adnotarea matricei, listรขnd numele dependenศ›elor ca ศ™iruri de caractere รฎnaintea funcศ›iei. Minificatoarele redenumesc argumentele funcศ›iilor, dar niciodatฤƒ literalii de tip ศ™ir de caractere, astfel รฎncรขt injectorul rezolvฤƒ รฎn continuare $scope ศ™i orice servicii corect.

Da. AI Asistenศ›ii produc legฤƒturile modulului, controlerului ศ™i domeniului de aplicare dintr-o descriere simplฤƒ a ecranului. Verificaศ›i รฎntotdeauna adnotarea dependenศ›ei, deoarece codul generat o omite adesea.

Instrumentele de inteligenศ›ฤƒ artificialฤƒ rescriu atribuirile de domenii de aplicare ca proprietฤƒศ›i pe o variabilฤƒ vm capturatฤƒ ศ™i adaugฤƒ un prefix fiecฤƒrei legฤƒturi de vizualizare corespunzฤƒtoare cu aliasul. Revvizualizaศ›i manual apelurile $watch ศ™i listenerele de evenimente, deoarece acestea necesitฤƒ รฎn continuare obiectul scope.

Rezumaศ›i aceastฤƒ postare cu: