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 à utiliserpc
directement ou brillant au cours de cette situation. Je suppose que vous pourriez mettre en place une chaîne d'héritage entreparentCtrl
etchildCtrl
, par exemplechildCtrl.prototype = Object.create(parentCtrl.prototype)
et puis dans votrechildCtrl
constructeur,this.name
renvoie au nom du parent avant d'ombre.
Vous devez vous connecter pour publier un commentaire.
Après des recherches, je suis arrivé à la constatation suivante:
$scope
fait exactement ce que son nom l'indique: c'est à dire qu'il définit ViewModel propriétés sur le$scope
. Ce qui fonctionne le mieux pour le partage de portée avec imbriqué contrôleurs qui peuvent utiliser le$scope
de conduire leur propre logique ou de la changer.Voici un exemple:
JS:
HTML:
Vous devriez faire comme :
html
js
prendre un coup d'oeil à https://docs.angularjs.org/guide/controller
Pour ceux qui cherchent à accéder simplement à la portée parent par programmation, utilisez la
$scope
service, de trouver de la portée parent, d'accès et le nom utilisé pour le parent ducontrollerAs
, par exemple:$scope.$parent.someName.doSomething();