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.

  • ๐Ÿ”— Ruolo vincolante: $scope trasferisce le variabili membro da un controller alla vista, in modo che i template visualizzino i dati senza interagire direttamente con il DOM.
  • โš™๏ธ Funzioni comportamentali: รˆ possibile associare funzioni a $scope quando la vista deve reagire a clic, modifiche di input o altri eventi utente.
  • ๐ŸŒณ Gerarchia dell'ambito: Direttive come ng-controller e ng-repeat creano ambiti figli che rispecchiano la struttura DOM dell'applicazione.
  • ๐ŸŒ Portata di $rootScope: Esiste un solo $rootScope per applicazione, che si comporta come un oggetto globale a cui ogni ambito figlio puรฒ accedere in lettura.
  • ๐Ÿ” Ciclo digestivo: $watch registra i listener, $apply entra nel contesto di esecuzione di AngularJS e $digest confronta i valori fino a quando il modello non si stabilizza.
  • ๐Ÿš€ Abitudine di prestazione: Mantieni le espressioni watch economiche, evita l'accesso al DOM al loro interno e chiama $destroy sugli ambiti che non sono piรน necessari.

Che cos'รจ $Scope in AngularJS?

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:

$ambito in AngularJS

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

Code Spiegazione:

  1. Il nome del modulo รจ โ€œappโ€
  2. Il nome del controller รจ "HelloWorldCtrl"
  3. L'oggetto Scope รจ l'oggetto principale che viene utilizzato per passare le informazioni dal controller alla vista.
  4. 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:

  1. ParentCtrl definisce siteName nel suo ambito di applicazione.
  2. ChildCtrl non definisce mai siteName, tuttavia il div interno viene ancora stampato Guru99 perchรฉ la ricerca risale fino all'ambito padre.
  3. lesson risiede 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.

Impostazione o aggiunta di comportamenti

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

  1. Stiamo creando un comportamento chiamato "fullName". Questo comportamento รจ una funzione che accetta 2 parametri (firstName,lastname).
  2. Il comportamento restituisce quindi la concatenazione di questi 2 parametri.
  3. 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:

Impostazione o aggiunta di comportamenti

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.

DOMANDE FREQUENTI

Un ambito isolato non eredita prototipicamente dal suo genitore. Le direttive dei componenti create con l'helper .component() ne ricevono sempre uno, il che mantiene i widget riutilizzabili indipendenti dal controller circostante e impedisce letture accidentali delle proprietร  del genitore.

$emit invia un evento di ambito verso l'alto attraverso gli ambiti padre fino a $rootScope, mentre $broadcast lo invia verso il basso a ogni ambito figlio. Entrambi vengono ricevuti con $on. Utilizzare $broadcast con parsimonia, perchรฉ visita ogni ambito discendente.

Chiama `scope.$destroy()` quando uno scope figlio non รจ piรน necessario. Questo interrompe la propagazione del digest nello scope e consente al garbage collector di recuperare i suoi modelli. Annulla anche la registrazione dei watcher manuali, chiamando la funzione restituita da `$watch`.

Assistenti come Copilota GitHub producono rapidamente codice boilerplate per l'ambito, ma emettono ancora errori come una virgola mancante nella registrazione di un controller. Controlla ogni snippet generato rispetto a quello ufficiale Documentazione sull'ambito di AngularJS.

Gli assistenti AI mappano le proprietร  $scope sui campi della classe del componente e riscrivono la logica $watch come segnali o flussi RxJS. Abbinali con l'ufficiale Angular documentare ed eseguire test unitari, perchรฉ le conversioni generate spesso non includono le ricerche di ambito ereditate.

Riassumi questo post con: