Eu tenho três controladores que são bastante semelhantes. Eu quero ter um controlador que esses três estendam e compartilhem suas funções.
fonte
Eu tenho três controladores que são bastante semelhantes. Eu quero ter um controlador que esses três estendam e compartilhem suas funções.
Talvez você não estenda um controlador, mas é possível estender um controlador ou transformar um único controlador em uma mistura de vários controladores.
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.
}]);
Quando o controlador pai é criado, a lógica contida nele também é executada. Veja $ controller () para obter mais informações sobre, mas apenas os$scope
valor precisa ser passado. Todos os outros valores serão injetados normalmente.
@warwar , sua preocupação é resolvida automaticamente por injeção de dependência angular. Tudo o que você precisa é injetar $ scope, embora você possa substituir os outros valores injetados, se desejar. Veja o seguinte exemplo:
(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>
Embora $ document não seja passado para 'simpleController' quando é criado por 'complexController', o documento $ é injetado para nós.
$.extend()
, você pode simplesmente chamar$controller('CtrlImpl', {$scope: $scope});
angular.extend
(ou$.extend
) na verdade significa estender a$scope
única, mas se o seu controlador de base também define algumas propriedades (por exemplothis.myVar=5
), você só tem acesso athis.myVar
no controlador estendendo ao usarangular.extend
handleSubmitClick
que chamaria ohandleLogin
que, por sua vez, tinha aloginSuccess
eloginFail
. Então, no meu controlador estendida Então eu tive que sobrecarregar ohandleSubmitClick
,handleLogin
eloginSucess
para a correctaloginSuccess
função a ser usada.Para herança, você pode usar padrões de herança JavaScript padrão. Aqui está uma demonstração que usa
$injector
Caso você use a
controllerAs
sintaxe (que eu recomendo), é ainda mais fácil usar o padrão de herança clássico:Outra maneira poderia ser criar apenas a função construtora "abstrata", que será seu controlador base:
Postagem no blog sobre este tópico
fonte
Bem, não sei exatamente o que você deseja alcançar, mas geralmente os Serviços são o caminho a percorrer. Você também pode usar as características de herança Scope do Angular para compartilhar código entre controladores:
fonte
$scope.$parent.fx( )
seria uma maneira muito mais limpa de fazê-lo, pois é onde é realmente definido?Você não estende controladores. Se eles executam as mesmas funções básicas, essas funções precisam ser movidas para um serviço. Esse serviço pode ser injetado nos seus controladores.
fonte
Ainda outra boa solução retirada deste artigo :
fonte
Você pode criar um serviço e herdar seu comportamento em qualquer controlador apenas injetando-o.
Em seu controlador, você deseja estender o serviço reusableCode acima:
DEMO PLUNKER: http://plnkr.co/edit/EQtj6I0X08xprE8D0n5b?p=preview
fonte
Você pode tentar algo como isto (não testei):
fonte
Você pode estender com serviços , fábricas ou fornecedores . eles são os mesmos, mas com diferentes graus de flexibilidade.
aqui um exemplo usando factory: http://jsfiddle.net/aaaflyvw/6KVtj/2/
E aqui você também pode usar a função de armazenamento:
fonte
Você pode usar diretamente $ controller ('ParentController', {$ scope: $ scope}) Exemplo
fonte
Você pode usar a sintaxe Angular "como" combinada à herança simples do JavaScript
Veja mais detalhes aqui http://blogs.microsoft.co.il/oric/2015/01/01/base-controller-angularjs/
fonte
Eu escrevi uma função para fazer isso:
Você pode usá-lo assim:
Prós:
Contras:
fonte
Considero estender os controladores como uma má prática. Em vez disso, coloque sua lógica compartilhada em um serviço. Objetos estendidos em javascript tendem a ficar bastante complexos. Se você deseja usar herança, eu recomendaria texto datilografado. Ainda assim, controladores finos são a melhor maneira de seguir meu ponto de vista.
fonte