Je vois dans les contrôleurs que $ scope a $ root, qu'est-ce que c'est? En quoi 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 du $rootScope
. Ils sont créés via le $new
méthode du $rootScope
ainsi chaque portée hérite du $rootScope
.
Dans la source angular 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 le $root
var n'est qu'un espace réservé pour this
de la première étendue créée - $rootScope
.
Ensuite, il y a ce morceau de code dans le $new
méthode:
$new: function(isolate) {
...
if (isolate) {
child = new Scope();
child.$root = this.$root;
...
return child;
Alors le $root
var de chaque enfant de portée 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 vaut mieux utiliser le $rootScope
via l'injection de dépendances car il s'agit d'une manière explicite et généralement plus fréquemment utilisée de faire référence à $rootScope
Comme mentionné précédemment, $scope.$root
contient une référence à $rootScope
.
Malheureusement, il y a IS une différence entre l'utilisation de $scope.$root
et en utilisant $rootScope
:
$scope
IS la racine, son $root
la propriété 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#L204Vous pourriez donc avoir une situation où $scope.$root
est null
. Mieux utiliser $rootScope
au lieu...