Je vois dans les contrôleurs que $ scope a $ root, c'est quoi? Comment est-il différent de $ rootScope qui peut être injecté dans le contrôleur?
$rootScope
var qui pointe vers le parent de toutes les étendues et peut être injecté partout. Toutes les autres étendues sont des enfants de $rootScope
. Ils sont créés via la $new
méthode $rootScope
chaque portée hérite de $rootScope
.
Dans la source angulaire dans la définition du constructeur Scope
il y a une ligne :
function Scope() { this.$id = nextUid(); ... this['this'] = this.$root = this; ...
Il semble que $root
var $root
soit juste un espace réservé pour la première portée créée – $rootScope
.
Ensuite, il y a ce code dans la $new
méthode:
$new: function(isolate) { ... if (isolate) { child = new Scope(); child.$root = this.$root; ... return child;
Donc, la $rootScope
$root
de chaque champ enfant de $rootScope
est une référence à $rootScope
. Et tous les enfants de ces enfants obtiendront la même référence à $rootScope
À mon avis, il est préférable d'utiliser le $rootScope
via l'injection de dépendance, car il s'agit d'une manière explicite et généralement plus fréquemment utilisée de se référer à $rootScope
Comme mentionné précédemment, $scope.$root
$rootScope
contient une référence à $rootScope
.
Malheureusement, il y a une différence entre l'utilisation de $scope.$root
$rootScope
et using $rootScope
:
$scope
IS est la racine, sa propriété $root
est null
$scope.$root
n'est attribué que sur les étendues isolées: https://github.com/angular/angular.js/blob/v1.3.6/src/ng/rootScope.js#L204 Vous pourriez donc avoir une situation où $scope.$root
est null
. Mieux utiliser $rootScope
place …