Ti consiglio di leggere la documentazione ufficiale di Angular approfondita per gli ambiti. Inizia dalla sezione "Gerarchie di ambito":
https://docs.angularjs.org/guide/scope
In sostanza, $ rootScope e $ scope identificano entrambi parti specifiche del DOM all'interno del quale
- Vengono eseguite operazioni angolari
- sono disponibili variabili dichiarate come parte di $ rootScope o $ scope
Tutto ciò che appartiene a $ rootScope è disponibile a livello globale nella tua app Angular, mentre tutto ciò che appartiene a $ scope è disponibile nella parte del DOM a cui si applica tale ambito.
$ RootScope viene applicato all'elemento DOM che è l'elemento radice per l'app Angular (da cui il nome $ rootScope). Quando aggiungi la direttiva ng-app a un elemento del DOM, questo diventa l'elemento radice del DOM all'interno del quale è disponibile $ rootScope. In altre parole, le proprietà ecc. Di $ rootScope saranno disponibili in tutta l'applicazione Angular.
Un $ scope angolare (e tutte le sue variabili e operazioni) è disponibile per un particolare sottoinsieme del DOM all'interno dell'applicazione. In particolare, lo $ scope per ogni particolare controller è disponibile per la parte del DOM a cui è stato applicato quel particolare controller (usando la direttiva ng-controller). Si noti tuttavia che alcune direttive, ad esempio ng-repeat, quando applicate all'interno di una parte del DOM in cui è stato applicato il controller, possono creare ambiti secondari dell'ambito principale - all'interno dello stesso controller - un controller non contiene necessariamente un solo ambito.
Se guardi l'HTML generato quando esegui la tua app Angular, puoi facilmente vedere quali elementi DOM 'contengono' uno scope, poiché Angular aggiunge la classe ng-scope su qualsiasi elemento a cui è stato applicato uno scope (incluso l'elemento root dell'app, che ha $ rootScope).
A proposito, il segno '$' all'inizio di $ scope e $ rootScope è semplicemente un identificatore in Angular per cose riservate da Angular.
Si noti che l'utilizzo di $ rootScope per la condivisione di variabili ecc. Tra moduli e controller non è generalmente considerato una best practice. Gli sviluppatori JavaScript parlano di evitare "l'inquinamento" dell'ambito globale condividendo le variabili lì, poiché potrebbero verificarsi conflitti in seguito se una variabile con lo stesso nome viene utilizzata da qualche altra parte, senza che lo sviluppatore si accorga che è già dichiarata su $ rootScope. L'importanza di ciò aumenta con le dimensioni dell'applicazione e del team che la sta sviluppando. Idealmente, $ rootScope conterrà solo costanti o variabili statiche, che devono essere coerenti in ogni momento nell'app. Un modo migliore per condividere cose tra i moduli potrebbe essere quello di utilizzare servizi e fabbriche, che è un altro argomento!