'cette' vs $portée dans AngularJS contrôleurs

Dans le "Créer des Composants" section de la page d'accueil de AngularJS, il y a cet exemple:

controller: function($scope, $element) {
  var panes = $scope.panes = [];
  $scope.select = function(pane) {
    angular.forEach(panes, function(pane) {
      pane.selected = false;
    });
    pane.selected = true;
  }
  this.addPane = function(pane) {
    if (panes.length == 0) $scope.select(pane);
    panes.push(pane);
  }
}

Remarquez comment le select méthode est ajoutée à $scope, mais le addPane méthode est ajoutée à this. Si je l'ai changer pour $scope.addPane, le code des pauses.

La documentation indique qu'il y a en fait une différence, mais il ne mentionne pas quelle est la différence:

Les versions précédentes Angulaire (pré 1.0 RC) vous a permis d'utiliser this de façon interchangeable avec le $scope méthode, mais ce n'est plus le cas. À l'intérieur des méthodes définies dans le champ d'application this et $scope sont interchangeables (angulaire fixe this à $scope), mais pas le contraire à l'intérieur de votre contrôleur de constructeur.

Comment this et $scope travail dans AngularJS contrôleurs?

Je trouve cela déroutant aussi. Lorsqu'une vue spécifie un contrôleur (par exemple, ng-controller='...'), le montant de la portée associée avec le contrôleur semble venir avec elle, parce que la vue peut accéder à $propriétés de portée. Mais quand une directive " exiger un autre contrôleur (et puis l'utilise dans sa fonction de liaison), le montant de la portée associée avec le contrôleur ne vient pas avec elle?
C'est que confusion à propos de "les versions Précédentes..." a été retiré par maintenant? Alors peut-être mise à jour devrait être en place?
Pour les tests unitaires, si vous utilisez la "cela" au lieu de "$champ d'application", vous ne pouvez pas injecter le contrôleur avec un moqué de portée, et vous ne pouvez pas faire les tests unitaires. Je ne pense pas que c'est une bonne pratique à utiliser "il".

OriginalL'auteur Alexei Boronine | 2012-07-23