J'ai trois contrôleurs assez similaires. Je veux avoir un contrôleur dont ces trois éléments étendent et partagent ses fonctions.
la source
J'ai trois contrôleurs assez similaires. Je veux avoir un contrôleur dont ces trois éléments étendent et partagent ses fonctions.
Peut-être que vous n'étendez pas un contrôleur, mais il est possible d'étendre un contrôleur ou de faire d'un seul contrôleur un mixin de plusieurs contrôleurs.
module.controller('CtrlImplAdvanced', ['$scope', '$controller', function ($scope, $controller) {
// Initialize the super class and extend it.
angular.extend(this, $controller('CtrlImpl', {$scope: $scope}));
… Additional extensions to create a mixin.
}]);
Lorsque le contrôleur parent est créé, la logique qu'il contient est également exécutée. Voir $ controller () pour plus d'informations sur mais seule la $scope
valeur doit être transmise. Toutes les autres valeurs seront injectées normalement.
@mwarren , votre préoccupation est prise en charge automatiquement par injection de dépendance angulaire. Tout ce dont vous avez besoin est d'injecter $ scope, bien que vous puissiez remplacer les autres valeurs injectées si vous le souhaitez. Prenons l'exemple suivant:
(function(angular) {
var module = angular.module('stackoverflow.example',[]);
module.controller('simpleController', function($scope, $document) {
this.getOrigin = function() {
return $document[0].location.origin;
};
});
module.controller('complexController', function($scope, $controller) {
angular.extend(this, $controller('simpleController', {$scope: $scope}));
});
})(angular);
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.15/angular.js"></script>
<div ng-app="stackoverflow.example">
<div ng-controller="complexController as C">
<span><b>Origin from Controller:</b> {{C.getOrigin()}}</span>
</div>
</div>
Bien que $ document ne soit pas passé dans 'simpleController' lorsqu'il est créé par 'complexController', $ document est injecté pour nous.
$.extend()
, vous pouvez simplement appeler$controller('CtrlImpl', {$scope: $scope});
angular.extend
(ou$.extend
) signifie en fait étendre le$scope
seul, mais si votre contrôleur de base définit également certaines propriétés (par exemplethis.myVar=5
), vous n'avez accès qu'àthis.myVar
dans le contrôleur d'extension lorsque vous utilisezangular.extend
handleSubmitClick
qui appelleraithandleLogin
qui à son tour avait unloginSuccess
etloginFail
. Ainsi, dans mon contrôleur étendu , je devais alors surcharger lehandleSubmitClick
,handleLogin
etloginSucess
pour la bonneloginSuccess
fonction à utiliser.Pour l'héritage, vous pouvez utiliser des modèles d'héritage JavaScript standard. Voici une démo qui utilise
$injector
Si vous utilisez la
controllerAs
syntaxe (que je recommande vivement), il est encore plus facile d'utiliser le modèle d'héritage classique:Une autre façon pourrait être de créer simplement une fonction constructeur "abstraite" qui sera votre contrôleur de base:
Article de blog sur ce sujet
la source
Eh bien, je ne sais pas exactement ce que vous voulez atteindre, mais les services sont généralement la voie à suivre. Vous pouvez également utiliser les caractéristiques d'héritage de portée d'Angular pour partager du code entre les contrôleurs:
la source
$scope.$parent.fx( )
une façon beaucoup plus propre de le faire, puisque c'est là que cela est réellement défini?Vous n'étendez pas les contrôleurs. S'ils exécutent les mêmes fonctions de base, ces fonctions doivent être déplacées vers un service. Ce service peut être injecté dans vos contrôleurs.
la source
Encore une bonne solution tirée de cet article :
la source
Vous pouvez créer un service et hériter de son comportement dans n'importe quel contrôleur simplement en l'injectant.
Ensuite, dans votre contrôleur que vous souhaitez étendre à partir du service reusableCode ci-dessus:
DÉMO PLUNKER: http://plnkr.co/edit/EQtj6I0X08xprE8D0n5b?p=preview
la source
Vous pouvez essayer quelque chose comme ça (je n'ai pas testé):
la source
Vous pouvez étendre avec des services , des usines ou des fournisseurs . ils sont identiques mais avec un degré de flexibilité différent.
voici un exemple utilisant l'usine: http://jsfiddle.net/aaaflyvw/6KVtj/2/
Et ici, vous pouvez également utiliser la fonction de stockage:
la source
Vous pouvez utiliser directement $ controller ('ParentController', {$ scope: $ scope}) Exemple
la source
Vous pouvez utiliser la syntaxe angulaire "en tant que" associée à l'héritage JavaScript brut
Voir plus de détails ici http://blogs.microsoft.co.il/oric/2015/01/01/base-controller-angularjs/
la source
J'ai écrit une fonction pour faire ceci:
Vous pouvez l'utiliser comme ceci:
Avantages:
Les inconvénients:
la source
Je considère l'extension des contrôleurs comme une mauvaise pratique. Mettez plutôt votre logique partagée dans un service. Les objets étendus en javascript ont tendance à devenir plutôt complexes. Si vous souhaitez utiliser l'héritage, je recommanderais dactylographié. Pourtant, les contrôleurs minces sont la meilleure façon d'aller de mon point de vue.
la source