Dentro de um módulo, um controlador pode herdar propriedades de um controlador externo:
var app = angular.module('angularjs-starter', []);
var ParentCtrl = function ($scope, $location) {
};
app.controller('ChildCtrl', function($scope, $injector) {
$injector.invoke(ParentCtrl, this, {$scope: $scope});
});
Exemplo via: Dead link : http://blog.omkarpatil.com/2013/02/controller-inheritance-in-angularjs.html
Um controlador dentro de um módulo também pode herdar de um irmão?
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
});
O segundo código não funciona, pois $injector.invoke
requer uma função como primeiro parâmetro e não encontra a referência ParentCtrl
.
angularjs
inheritance
angularjs-controller
Federico Elles
fonte
fonte
Respostas:
Sim, mas você pode usar o
$controller
serviço para instanciar o controlador: -fonte
ParentCtrl
deve ser umcontroller
ou é possível usar umservice
?$controller
só pode usar controladores registrados.$scope
parathis
(em teoria)Caso você esteja usando a
vm
sintaxe do controlador , aqui está minha solução:Infelizmente, você não pode usar
$controller.call(vm, 'BaseGenericCtrl'...)
, para passar o contexto atual para areload()
função de fechamento (for ), portanto, apenas uma solução é usar athis
função herdada dentro para alterar dinamicamente o contexto.fonte
vm
é apenas uma variável dentro do controlador, acho que o Angular não pode usá-lo como esperado.Eu acho que você deve usar fábrica ou serviço, para fornecer funções ou dados acessíveis para os dois controladores.
aqui está pergunta semelhante ---> herança do controlador AngularJS
fonte
loading
variável universal para que, quando os dados sejam carregados, eu sempre faça a mesma coisa, não acho que as fábricas possam fazer isso. Meu controlador pai pode ter uma variável de carregamento, mas a fábrica não pode manipulá-la ... certo ?!Em resposta à questão levantada em nesta resposta por gmontague , encontrei um método para herdar um controlador usando $ controller () e ainda utilizo o controlador "como" sintaxe.
Primeiramente, use a sintaxe "as" ao herdar a chamada de $ controller ():
Em seguida, no modelo HTML, se a propriedade for definida pelo pai, use
parent.
para recuperar propriedades herdadas do pai; se definido por filho, use-ochild.
para recuperá-lo.fonte
Bem, eu fiz isso de outra maneira. No meu caso, eu queria uma função que aplique as mesmas funções e propriedades em outros controladores. Eu gostei, exceto pelos parâmetros. Dessa forma, todos os seus ChildCtrls precisam receber $ location.
fonte
Para aqueles que se perguntam, você pode estender os controladores de componentes da mesma maneira, usando o método na resposta aceita.
Use a seguinte abordagem:
Componente pai (para estender):
Componente filho (aquele que se estende):
O truque é usar controladores nomeados, em vez de defini-los na definição do componente.
fonte
Como mencionado na resposta aceita, você pode "herdar" as modificações de um controlador pai no $ scope e outros serviços chamando:
$controller('ParentCtrl', {$scope: $scope, etc: etc});
no seu controlador filho.No entanto , isso falhará se você estiver acostumado a usar a sintaxe do controlador 'como', por exemplo, em
Se
foo
foi definido no controlador pai (viathis.foo = ...
), o controlador filho não terá acesso a ele.Conforme mencionado nos comentários, você pode atribuir o resultado de $ controller diretamente ao escopo:
Nota: Você deve remover a parte 'como' de
ng-controller=
, porque está especificando o nome da instância no código e não mais o modelo.fonte
Eu estava usando a sintaxe "Controller as" com
vm = this
e queria herdar um controlador. Eu tive problemas se meu controlador pai tivesse uma função que modificasse uma variável.Usando as respostas de IProblemFactory e Salman Abbas , fiz o seguinte para ter acesso às variáveis pai:
fonte
Você pode usar um mecanismo simples de herança JavaScript. Além disso, não esqueça de passar um serviço angular necessário para invocar o método .call.
fonte
Consulte o link mencionado abaixo para saber as heranças de AngularJs.
Controlador-Herança-em-angularjs
fonte