Je vous recommande de lire la documentation officielle détaillée Angular pour les oscilloscopes. Commencez par la section 'Hiérarchies d'étendues':
https://docs.angularjs.org/guide/scope
Essentiellement, $ rootScope et $ scope identifient tous deux des parties spécifiques du DOM dans lesquelles
- Des opérations angulaires sont effectuées
- les variables déclarées dans le cadre de $ rootScope ou $ scope sont disponibles
Tout ce qui appartient à $ rootScope est disponible globalement dans votre application Angular, tandis que tout ce qui appartient à une $ scope est disponible dans la partie du DOM à laquelle cette portée s'applique.
Le $ rootScope est appliqué à l'élément DOM qui est l'élément racine de l'application Angular (d'où le nom $ rootScope). Lorsque vous ajoutez la directive ng-app à un élément du DOM, cela devient l'élément racine du DOM dans lequel $ rootScope est disponible. En d'autres termes, les propriétés, etc. de $ rootScope seront disponibles dans toute votre application Angular.
Une portée Angular $ (et toutes ses variables et opérations) est disponible pour un sous-ensemble particulier du DOM au sein de votre application. Plus précisément, la portée $ de tout contrôleur particulier est disponible pour la partie du DOM à laquelle ce contrôleur particulier a été appliqué (en utilisant la directive ng-controller). Notez cependant que certaines directives, par exemple ng-repeat, lorsqu'elles sont appliquées dans une partie du DOM où le contrôleur a été appliqué, peuvent créer des portées enfants de la portée principale - dans le même contrôleur - un contrôleur ne contient pas nécessairement une seule portée.
Si vous regardez le HTML généré lorsque vous exécutez votre application Angular, vous pouvez facilement voir quels éléments DOM `` contiennent '' une portée, car Angular ajoute la classe ng-scope sur tout élément auquel une portée a été appliquée (y compris l'élément racine de l'application, qui a le $ rootScope).
À propos, le signe '$' au début de $ scope et $ rootScope est simplement un identifiant dans Angular pour les éléments réservés par Angular.
Notez que l'utilisation de $ rootScope pour partager des variables, etc. entre les modules et les contrôleurs n'est généralement pas considérée comme une meilleure pratique. Les développeurs JavaScript parlent d'éviter la `` pollution '' de la portée globale en y partageant des variables, car il peut y avoir des conflits plus tard si une variable du même nom est utilisée ailleurs, sans que le développeur se rende compte qu'elle est déjà déclarée sur le $ rootScope. L'importance de cela augmente avec la taille de l'application et l'équipe qui la développe. Idéalement, $ rootScope ne contiendra que des constantes ou des variables statiques, destinées à être cohérentes à tout moment dans l'application. Une meilleure façon de partager des éléments entre les modules peut être d'utiliser des services et des usines, ce qui est un autre sujet!