Au sein d'un module, un contrôleur peut hériter des propriétés d'un contrôleur externe:
var app = angular.module('angularjs-starter', []);
var ParentCtrl = function ($scope, $location) {
};
app.controller('ChildCtrl', function($scope, $injector) {
$injector.invoke(ParentCtrl, this, {$scope: $scope});
});
Exemple via: Lien mort : http://blog.omkarpatil.com/2013/02/controller-inheritance-in-angularjs.html
Un contrôleur à l'intérieur d'un module peut-il également hériter d'un frère?
var app = angular.module('angularjs-starter', []);
app.controller('ParentCtrl ', function($scope) {
//I'm the sibling, but want to act as parent
});
app.controller('ChildCtrl', function($scope, $injector) {
$injector.invoke(ParentCtrl, this, {$scope: $scope}); //This does not work
});
Le second code ne fonctionne pas car $injector.invoke
nécessite une fonction comme premier paramètre et ne trouve pas la référence à ParentCtrl
.
angularjs
inheritance
angularjs-controller
Federico Elles
la source
la source
Réponses:
Oui, cela peut mais vous devez utiliser le
$controller
service pour instancier le contrôleur à la place: -la source
ParentCtrl
devrait être uncontroller
ou est-il possible d'utiliser unservice
?$controller
il ne peut utiliser que des contrôleurs enregistrés.$scope
àthis
(en théorie)Dans le cas où vous utilisez la
vm
syntaxe du contrôleur , voici ma solution:Malheureusement, vous ne pouvez pas utiliser
$controller.call(vm, 'BaseGenericCtrl'...)
, pour passer le contexte actuel dans la fonction de fermeture (pourreload()
), donc une seule solution est d'utiliser lathis
fonction héritée à l'intérieur afin de changer dynamiquement le contexte.la source
vm
est juste une variable à l'intérieur du contrôleur, je ne pense pas que Angular puisse l'utiliser comme prévu.Je pense que vous devriez utiliser l'usine ou le service pour donner des fonctions ou des données accessibles aux deux contrôleurs.
voici une question similaire ---> Héritage du contrôleur AngularJS
la source
loading
variable universelle pour que lorsque les données se chargent, je fasse toujours la même chose, je ne pense pas que les usines puissent le faire. Mon contrôleur parent peut avoir une variable de chargement mais l'usine ne peut pas la manipuler ... non?!En réponse au problème soulevé dans cette réponse par gmontague , j'ai trouvé une méthode pour hériter d'un contrôleur en utilisant $ controller (), et toujours utiliser la syntaxe du contrôleur "as".
Tout d'abord, utilisez la syntaxe "as" lorsque vous héritez de l'appel de $ controller ():
Ensuite, dans le modèle HTML, si la propriété est définie par le parent, utilisez-la
parent.
pour récupérer les propriétés héritées du parent; s'il est défini par l'enfant, utilisez-lechild.
pour le récupérer.la source
Eh bien, je l'ai fait d'une autre manière. Dans mon cas, je voulais une fonction qui applique les mêmes fonctions et propriétés dans d'autres contrôleurs. Je l'ai aimé, sauf par paramètres. De cette façon, tous vos ChildCtrls doivent recevoir $ location.
la source
Pour ceux qui se demandent, vous pouvez étendre les contrôleurs de composants de la même manière, en utilisant la méthode dans la réponse acceptée.
Utilisez l'approche suivante:
Composant parent (à partir duquel):
Composant enfant (celui qui s'étend):
L'astuce consiste à utiliser des contrôleurs nommés, au lieu de les définir dans la définition du composant.
la source
Comme mentionné dans la réponse acceptée, vous pouvez "hériter" des modifications d'un contrôleur parent sur $ scope et d'autres services en appelant:
$controller('ParentCtrl', {$scope: $scope, etc: etc});
dans votre contrôleur enfant.Cependant , cela échoue si vous êtes habitué à utiliser la syntaxe du contrôleur «as», par exemple dans
Si a
foo
été défini dans le contrôleur parent (viathis.foo = ...
), le contrôleur enfant n'y aura pas accès.Comme mentionné dans les commentaires, vous pouvez affecter le résultat de $ controller directement à la portée:
Remarque: Vous devez ensuite supprimer la partie «en tant que» de
ng-controller=
, car vous spécifiez le nom de l'instance dans le code et non plus le modèle.la source
J'utilisais la syntaxe "Controller as" avec
vm = this
et voulais hériter d'un contrôleur. J'ai eu des problèmes si mon contrôleur parent avait une fonction qui modifiait une variable.En utilisant les réponses d'IProblemFactory et de Salman Abbas , j'ai fait ce qui suit pour avoir accès aux variables parents:
la source
Vous pouvez utiliser un mécanisme d'héritage JavaScript simple. N'oubliez pas non plus de passer un service angulaire nécessaire pour invoquer la méthode .call.
la source
Reportez-vous au lien mentionné ci-dessous pour les héritages AngularJs.
Controller-Inheritance-in-angularjs
la source