Cos'รจ $scope in AngularJS? Tutorial con esempio
โก Riepilogo intelligente
In AngularJS, $Scope รจ l'oggetto integrato che collega un controller alla sua vista. Questa pagina spiega la creazione dello scope, le funzioni di comportamento, la gerarchia padre-figlio, la differenza rispetto a $rootScope e come i cicli di digest aggiornano i binding.
Cos'รจ $scope in AngularJS?
$ambito in AngularJS รจ un oggetto integrato che fondamentalmente lega il "controller" e la "vista". ร possibile definire variabili membro nell'ambito del controller a cui รจ quindi possibile accedere dalla vista.
Ogni controller in un AngularJS L'applicazione riceve la propria istanza di $scope tramite dependency injection. Qualunque cosa tu alleghi a quell'oggetto diventa visibile al template governato dal controller, quindi $scope si comporta come il modello di dati condiviso che si trova tra il tuo JavaLogica dello script e markup HTML.
Considera l'esempio seguente:
angular.module('app',[]).controller('HelloWorldCtrl', function($scope) { $scope.message = "Hello World" });
Code Spiegazione:
- Il nome del modulo รจ โappโ
- Il nome del controller รจ "HelloWorldCtrl"
- L'oggetto Scope รจ l'oggetto principale che viene utilizzato per passare le informazioni dal controller alla vista.
- Variabile membro aggiunta all'oggetto ambito
โ ๏ธ Avviso di sintassi: Migliori .controller() Il metodo accetta due argomenti, il nome del controller e la funzione factory, quindi รจ necessaria una virgola tra 'HelloWorldCtrl' and function($scope). Omettere la virgola genera un errore Uncaught SyntaxError prima ancora che AngularJS si avvii.
Un singolo controller e una singola vista rappresentano solo metร del quadro. Le applicazioni reali annidano i controller, ripetono gli elenchi e riutilizzano i widget, il che significa che esistono piรน ambiti contemporaneamente.
Come funzionano la gerarchia degli ambiti e l'ereditarietร in AngularJS
Ogni applicazione AngularJS ha esattamente uno scope radice e puรฒ avere un numero qualsiasi di scope figli. Le direttive creano questi scope figli e li collegano all'elemento DOM che decorano, in modo che l'albero degli scope rispecchi la struttura della pagina renderizzata.
Quando AngularJS valuta un'espressione come {{siteName}}Innanzitutto, cerca quella proprietร nello scope associato all'elemento. Se la proprietร non รจ presente, la ricerca si sposta allo scope padre e continua a risalire fino a raggiungere lo scope radice. JavaGli sviluppatori di script conoscono questo comportamento come ereditarietร prototipale, e gli ambiti figli ereditano dai loro genitori esattamente in questo modo.
L'esempio seguente annida un controller all'interno di un altro, permettendoti di osservare il funzionamento dell'ereditarietร .
<div ng-app="scopeDemo"> <div ng-controller="ParentCtrl"> Parent scope value: {{siteName}} <div ng-controller="ChildCtrl"> Child reads parent value: {{siteName}} Child own value: {{lesson}} </div> </div> </div> <script type="text/javascript"> var app = angular.module("scopeDemo", []); app.controller("ParentCtrl", function($scope) { $scope.siteName = "Guru99"; }); app.controller("ChildCtrl", function($scope) { $scope.lesson = "AngularJS Scope"; }); </script>
Code Spiegazione:
ParentCtrldefiniscesiteNamenel suo ambito di applicazione.ChildCtrlnon definisce maisiteName, tuttavia il div interno viene ancora stampato Guru99 perchรฉ la ricerca risale fino all'ambito padre.lessonrisiede solo nell'ambito figlio, quindi il div padre non puรฒ leggerlo.
Quali direttive creano un nuovo ambito?
- ng-controller: crea un ambito figlio per l'elemento su cui viene posizionato.
- ng-repeat: crea un ambito figlio per iterazione, motivo per cui ogni riga puรฒ contenere valori diversi per la stessa espressione.
- Direttive personalizzate: puรฒ richiedere un ambito figlio, o un isolato ambito che deliberatamente non eredita dal suo genitore.
- Direttive dei componenti: qualsiasi cosa registrata con il
.component()L'helper riceve sempre un ambito isolato.
Poichรฉ gli ambiti figli leggono verso l'alto, gli sviluppatori spesso si chiedono dove si trovi il vertice di questa catena. L'oggetto di livello superiore si chiama $rootScope.
$scope vs $rootScope: qual รจ la differenza?
AngularJS $rootScope $rootScope rappresenta l'ambito dell'intera applicazione. Un'applicazione puรฒ avere un solo $rootScope, che viene utilizzato come una variabile globale. Ogni $scope รจ un ambito figlio, mentre $rootScope รจ l'ambito padre, in cima all'albero. La tabella seguente confronta i due oggetti.
| Aspetto | $scope | $rootScope |
|---|---|---|
| Istanze per applicazione | Molteplici, una per ogni controller o direttiva di creazione dell'ambito. | Esattamente uno |
| Creato da | Direttive come ng-controller e ng-repeat | L'iniettore durante l'avvio dell'applicazione |
| Visibilitร | Il suo elemento proprio e tutti i suoi discendenti | Ogni ambito nell'applicazione |
| Utilizzo tipico | Dati e comportamento per una vista o una riga di elenco | valori a livello di applicazione, come ad esempio un utente connesso |
| Rischio principale | I valori diventano irraggiungibili al di fuori della filiale | Conflitti di nomi e accoppiamento nascosto, come le variabili globali |
Utilizzare $rootScope con parsimonia. Tutto ciรฒ che viene inserito lรฌ rimane valido per l'intera applicazione ed รจ leggibile ovunque, quindi un servizio condiviso รจ solitamente un luogo piรน sicuro per lo stato globale. L'ufficiale Riferimento $rootScope Elenca l'API completa.
Sapere dove risiedono i dati รจ metร del lavoro. L'altra metร consiste nell'insegnare allo scope come reagire quando l'utente compie un'azione.
Configurazione o aggiunta di comportamenti in AngularJS
Per reagire agli eventi o eseguire qualche tipo di calcolo/elaborazione nella View, dobbiamo fornire un comportamento all'ambito.
I comportamenti vengono aggiunti agli oggetti ambito per rispondere a eventi specifici che possono essere attivati โโdalla vista. Una volta definito il comportamento nel controller, รจ possibile accedervi dalla vista.
Diamo un'occhiata a un esempio di come possiamo raggiungere questo obiettivo.
<!DOCTYPE html> <html lang="en"> <head> <meta chrset="UTF 8"> <title>Guru99</title> </head> <body ng-app="DemoApp"> <h1> Guru99 Global Event</h1> <script src="https://code.angularjs.org/1.6.9/angular.js"></script> <div ng-controller="DemoController"> {{fullName("Guru","99")}} </div> <script type="text/javascript"> var app = angular.module("DemoApp", []); app.controller("DemoController", function($scope) { $scope.fullName=function(firstName,lastname){ return firstName + lastname; } } ); </script> </body> </html>
Code Spiegazione:
- Stiamo creando un comportamento chiamato "fullName". Questo comportamento รจ una funzione che accetta 2 parametri (firstName,lastname).
- Il comportamento restituisce quindi la concatenazione di questi 2 parametri.
- Nella vista stiamo chiamando il comportamento e passando 2 valori di โGuru" e "99" che vengono passati come parametri al comportamento.
Se il comando viene eseguito correttamente, quando si esegue il codice nel browser verrร visualizzato il seguente output.
Produzione:
Nel browser vedrai una concatenazione di entrambi i valori di Guru e 99 che sono stati trasmessi al comportamento nel controllore.
I binding come quello sopra si aggiornano automaticamente, ed รจ importante capire il meccanismo che permette questo processo prima che un'applicazione diventi di grandi dimensioni.
Perchรฉ Scope Watchers e il ciclo di digestione sono importanti
AngularJS mantiene la vista allineata con lo scope tramite il controllo delle modifiche (dirty checking) anzichรฉ tramite eventi di cambiamento. Tre API di scope guidano questo processo:
- $watch: registra un ascoltatore per un'espressione. Interpolazioni come
{{fullName}}registra gli osservatori per te durante il collegamento del modello. - $applica: Entra nel contesto di esecuzione di AngularJS, valuta il codice e quindi avvia un digest. ร necessario solo all'interno di callback di eventi personalizzati o callback di librerie di terze parti, perchรฉ le direttive integrate lo richiamano giร .
- $digest: Il processo esamina ogni osservatore su $rootScope e i suoi figli, confrontando il valore corrente con quello precedente, e si ripete finchรฉ il modello non smette di cambiare.
Poichรฉ un digest puรฒ eseguire diversi passaggi, le espressioni watch devono rimanere economiche. Evitare l'accesso al DOM al loro interno, poichรฉ la lettura del DOM รจ di ordini di grandezza piรน lenta della lettura di un JavaProprietร dello script.
Anche la profonditร di monitoraggio influisce sul costo. Il monitoraggio per riferimento รจ il piรน veloce e rileva la sostituzione dell'intero valore solo quando questo viene sostituito. $watchCollection Consente di rilevare gli elementi aggiunti, rimossi o riordinati all'interno di un array o di un oggetto. Il monitoraggio per valore attraversa una struttura annidata a ogni digest ed รจ l'opzione piรน dispendiosa, quindi รจ consigliabile utilizzarla per ultima.




