Devi essere consapevole di come funziona AngularJS per capirlo.
Ciclo digest e $ scope
Innanzitutto, AngularJS definisce il concetto di un cosiddetto ciclo digest . Questo ciclo può essere considerato come un ciclo, durante il quale AngularJS verifica se vi sono modifiche a tutte le variabili osservate da tutti $scope
i messaggi. Quindi, se hai $scope.myVar
definito nel tuo controller e questa variabile è stata contrassegnata per essere guardata , allora stai implicitamente dicendo ad AngularJS di monitorare le modifiche su myVar
ogni iterazione del loop.
Una domanda di follow-up naturale sarebbe: tutto è attaccato $scope
all'essere guardato? Fortunatamente no. Se osservassi le modifiche di ogni oggetto nel tuo $scope
, allora un ciclo digest richiederebbe tempi lunghi per essere valutato e potresti incorrere rapidamente in problemi di prestazioni. Ecco perché il team di AngularJS ci ha fornito due modi per dichiararne alcuni$scope
variabili come osservate (leggi sotto).
$ watch aiuta ad ascoltare le modifiche di $ scope
Esistono due modi per dichiarare una $scope
variabile come osservata.
- Usandolo nel tuo modello tramite l'espressione
<span>{{myVar}}</span>
- Aggiungendolo manualmente tramite il
$watch
servizio
Annuncio 1) Questo è lo scenario più comune e sono sicuro che lo hai già visto prima, ma non sapevi che questo ha creato un orologio in background. Sì, aveva! Utilizzo delle direttive AngularJS (comeng-repeat
) può anche creare orologi impliciti.
Annuncio 2) Ecco come crei i tuoi orologi . $watch
il servizio ti aiuta a eseguire un po 'di codice quando $scope
è cambiato un valore associato a . Viene usato raramente, ma a volte è utile. Ad esempio, se si desidera eseguire alcuni codici ogni volta che "myVar" cambia, è possibile effettuare le seguenti operazioni:
function MyController($scope) {
$scope.myVar = 1;
$scope.$watch('myVar', function() {
alert('hey, myVar has changed!');
});
$scope.buttonClicked = function() {
$scope.myVar = 2; // This will trigger $watch expression to kick in
};
}
$ apply consente di integrare le modifiche con il ciclo digest
Puoi pensare alla $apply
funzione come a un meccanismo di integrazione . Vedete, ogni volta che cambiate alcune variabili osservate associate a$scope
all'oggetto, AngularJS saprà che la modifica è avvenuta. Questo perché AngularJS sapeva già monitorare tali cambiamenti. Quindi, se accade nel codice gestito dal framework, il ciclo digest proseguirà.
Tuttavia, a volte si desidera modificare un valore al di fuori del mondo AngularJS e vedere i cambiamenti propagarsi normalmente. Considera questo: hai un $scope.myVar
valore che verrà modificato nel $.ajax()
gestore di un jQuery . Questo accadrà ad un certo punto in futuro. AngularJS non vede l'ora che ciò accada, poiché non è stato richiesto di attendere su jQuery.
Per affrontare questo, $apply
è stato introdotto. Ti consente di avviare esplicitamente il ciclo di digestione. Tuttavia, è consigliabile utilizzarlo solo per migrare alcuni dati su AngularJS (integrazione con altri framework), ma non utilizzare mai questo metodo combinato con il normale codice AngularJS, poiché AngularJS genererà un errore.
In che modo tutto ciò è legato al DOM?
Bene, dovresti davvero seguire di nuovo il tutorial, ora che sai tutto questo. Il ciclo digest assicurerà che l'interfaccia utente e il codice JavaScript rimangano sincronizzati, valutando ogni watcher collegato a tutti $scope
i messaggi finché non cambia nulla. Se non si verificano più modifiche nel ciclo digest, viene considerato finito.
È possibile allegare oggetti $scope
all'oggetto esplicitamente nel Controller o dichiarandoli nella {{expression}}
forma direttamente nella vista.
Spero che ciò aiuti a chiarire alcune conoscenze di base su tutto ciò.
Ulteriori letture: