web-dev-qa-db-fra.com

Quelle est la différence entre $ scope. $ Root et $ rootScope?

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?

41
Rishul Matta

$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 Scopeil 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

70
Igor Malyk

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:

  1. Quand $scope IS la racine, son $root la propriété est null
  2. $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 au lieu...

28
Danny R