L'accès hérité de portée avec le Contrôleur Comme approche

Avec l'original de la manière de définir des contrôleurs, l'accès à la mère de la portée a été assez difficile, car l'enfant fait hérite de son parent.

app.controller("parentCtrl", function($scope){
   $scope.name = "Parent";
})
.controller("childCtrl", function($scope){
   $scope.childName = "child of " + $scope.name;
});

<div ng-controller="parentCtrl">
   {{name}}
   <div ng-controller="childCtrl">
      {{childName}}
   </div>
</div>

Le Contrôleur-Que l'approche semble être le recommandé façon de déclarer un contrôleur. Mais avec le Contrôleur-Que, l'approche ci-dessus ne fonctionne plus.

Sûr, je peux accéder à la portée parent avec pc.name de la Vue:

<div ng-controller="parentCtrl as pc">
   {{pc.name}}
   <div ng-controller="childCtrl as cc">
      {{cc.childName}}
   </div>
</div>

J'ai quelques problèmes avec cette (potentiel de code spaghetti), mais cette question est à propos d'accéder à la portée parent de l'enfant contrôleur.

La seule façon que je peux voir ce travail est:

app.controller("parentCtrl", function(){
   this.name = "parent";
})
.controller("childCtrl", function($scope){
   $scope.pc.name = "child of " + $scope.name;
   //or
   $scope.$parent.pc.name = "child of " + $scope.name;

   //there's no $scope.name
   //and no $scope.$parent.name
});

Alors maintenant, le contrôleur enfant a besoin de savoir à propos de "pc" - à l'exception, ce qui devrait (dans mon esprit) être limité à la vue. Je ne pense pas qu'un contrôleur enfant devrait savoir sur le fait que la vue a décidé de déclarer un ng-controller="parentCtrl as pc".

Q: Quelle est la bonne approche?

EDIT:

Précisions: je ne suis pas à la recherche d'hériter d'un parent contrôleur. Je suis à la recherche d'hériter/modifier l'étendue partagée. Donc, si j'ai été de modifier le premier exemple, je devrais être capable de faire ce qui suit:

app.controller("parentCtrl", function($scope){
   $scope.someObj = {prop: "not set"};
})
.controller("childCtrl", function($scope){
   $scope.someObj.prop = "changed";
});
  • Angulaire de "contrôleurs" sont vraiment de plus d'un "helper de vue" ou un "modèle de vue". Les guides de style qui vous suggérons d'utiliser controllerAs activement vous encourageons à utiliser pc directement ou brillant au cours de cette situation. Je suppose que vous pourriez mettre en place une chaîne d'héritage entre parentCtrl et childCtrl, par exemple childCtrl.prototype = Object.create(parentCtrl.prototype) et puis dans votre childCtrl constructeur, this.name renvoie au nom du parent avant d'ombre.
InformationsquelleAutor New Dev | 2014-10-30