Sou novo no Angular e estou tentando descobrir como fazer as coisas ...
Usando o AngularJS, como posso injetar um controlador para ser usado em outro controlador?
Eu tenho o seguinte snippet:
var app = angular.module("testApp", ['']);
app.controller('TestCtrl1', ['$scope', function ($scope) {
$scope.myMethod = function () {
console.log("TestCtrl1 - myMethod");
}
}]);
app.controller('TestCtrl2', ['$scope', 'TestCtrl1', function ($scope, TestCtrl1) {
TestCtrl1.myMethod();
}]);
Quando eu executo isso, obtenho o erro:
Error: [$injector:unpr] Unknown provider: TestCtrl1Provider <- TestCtrl1
http://errors.angularjs.org/1.2.21/$injector/unpr?p0=TestCtrl1Provider%20%3C-%20TestCtrl1
Devo tentar usar um controlador dentro de outro controlador ou devo tornar isso um serviço?
TestCtrl1
para um serviço.Respostas:
Se sua intenção é obter um controlador já instanciado de outro componente e se você está seguindo uma abordagem baseada em componente / diretiva, você pode sempre usar
require
um controlador (instância de um componente) de outro componente que segue uma certa hierarquia.Por exemplo:
Agora, o uso dos componentes acima pode ser algo assim:
Há muitas maneiras de configurar o require .
Resposta antiga:
Você precisa injetar
$controller
serviço para instanciar um controlador dentro de outro controlador. Mas esteja ciente de que isso pode levar a alguns problemas de design. Você sempre pode criar serviços reutilizáveis que seguem a responsabilidade única e injetá-los nos controladores conforme necessário.Exemplo:
Em qualquer caso, você não pode chamar
TestCtrl1.myMethod()
porque anexou o método na$scope
instância do controlador e não na instância do controlador.Se você estiver compartilhando o controlador, será sempre melhor fazer: -
e enquanto consome, faça:
No primeiro caso, é realmente o
$scope
seu modelo de visualização e, no segundo caso, é a própria instância do controlador.fonte
var testCtrl1ViewModel = $scope.$new();
servar testCtrl1ViewModel = $rootScope.$new();
? consulte: docs.angularjs.org/guide/controller @PSLEu sugiro que a pergunta que você deve fazer é como injetar serviços nos controladores. Serviços gordos com controladores magros é uma boa regra, também conhecida como apenas use controladores para colar seu serviço / fábrica (com a lógica de negócios) em suas visualizações.
Os controladores obtêm o lixo coletado nas alterações de rota, então, por exemplo, se você usar controladores para manter a lógica de negócios que renderiza um valor, você perderá o estado em duas páginas se o usuário do aplicativo clicar no botão Voltar do navegador.
Aqui está uma demonstração de trabalho da fábrica injetada em dois controladores
Além disso, sugiro que você leia este tutorial sobre serviços / fábricas.
fonte
Não há necessidade de importar / injetar seu controlador em JS. Você pode simplesmente injetar seu controlador / controlador aninhado por meio de seu HTML. Funcionou para mim. Gostar :
fonte
Isso funciona melhor no meu caso, onde TestCtrl2 tem suas próprias diretivas.
Isso me dá um erro dizendo erro de injeção do scopeProvider.
Isso realmente não funciona se você tiver diretivas em 'TestCtrl1'; na verdade, essa diretiva tem um escopo diferente deste criado aqui. Você acaba com duas instâncias de 'TestCtrl1'.
fonte
A melhor solução:-
// Aqui você recebeu a primeira chamada do controlador sem executá-la
fonte
você também pode usar
$rootScope
para chamar uma função / método do primeiro controlador a partir do segundo controlador como este,fonte
use typescript para a sua codificação, porque é orientado a objetos, estritamente tipado e fácil de manter o código ...
para mais informações sobre o typescipt clique aqui
Aqui está um exemplo simples que criei para compartilhar dados entre dois controladores usando Typescript ...
}
fonte