Eu tenho um footerController e codeScannerController com diferentes visualizações.
angular.module('myApp').controller('footerController', ["$scope", function($scope) {}]);
angular.module('myApp').controller('codeScannerController', ["$scope", function($scope) {
console.log("start");
$scope.startScanner = function(){...
Quando clico em um <li>
no footer.html, devo receber esse evento no codeScannerController.
<li class="button" ng-click="startScanner()">3</li>
Acho que pode ser realizado com $on
e $broadcast
, mas não sei como e não consigo encontrar exemplos em lugar nenhum.
javascript
angularjs
Alice Polansky
fonte
fonte
$scope.$apply()
é necessário apenas ao alterar o modelo fora da estrutura angular (como em um setTimeout, um retorno de chamada de diálogo ou retorno de chamada de ajax); em outras palavras,$apply()
já é acionado após a conclusão de todo o código.$on()
.Primeiro, uma breve descrição de
$on()
,$broadcast()
e$emit()
:.$on(name, listener)
- Escuta um evento específico por um determinadoname
.$broadcast(name, args)
- Transmitir um evento através$scope
de todas as crianças.$emit(name, args)
- Emita um evento na$scope
hierarquia para todos os pais, incluindo o$rootScope
Com base no seguinte HTML (veja o exemplo completo aqui ):
Os eventos disparados percorrerão o
$scopes
seguinte:$scope
$scope
então$rootScope
$scope
depois pelo Controlador 3$scope
$scope
então$rootScope
$scope
$scope
, Controller 2 e$scope
depois$rootScope
$rootScope
e$scope
de todos os controladores (1, 2 e 3)$rootScope
JavaScript para acionar eventos (novamente, você pode ver um exemplo de trabalho aqui ):
fonte
Uma coisa que você deve saber é que o prefixo $ se refere a um método angular, os prefixos $$ se referem a métodos angulares que você deve evitar usar.
abaixo está um modelo de exemplo e seus controladores, exploraremos como $ broadcast / $ on pode nos ajudar a alcançar o que queremos.
Os controladores são
Minha pergunta para você é como você passa o nome para o segundo controlador quando um usuário clica em registrar? Você pode encontrar várias soluções, mas a que vamos usar está usando $ broadcast e $ on.
$ broadcast vs $ emitem
Qual devemos usar? $ broadcast canalizará para todos os elementos dom filhos e $ emit canalizará a direção oposta a todos os elementos dom ancestrais.
A melhor maneira de evitar decidir entre $ emit ou $ broadcast é canalizar a partir do $ rootScope e usar $ broadcast para todos os seus filhos. O que torna nosso caso muito mais fácil, já que nossos elementos dom são irmãos.
Adicionando $ rootScope e permite que $ broadcast
Observe que adicionamos $ rootScope e agora estamos usando $ broadcast (broadcastName, argumentos). Para broadcastName, queremos atribuir um nome exclusivo para que possamos pegar esse nome em nosso secondCtrl. Eu escolhi o BOOM! apenas por diversão. Os segundos argumentos 'argumentos' nos permitem passar valores para os ouvintes.
Recebendo nossa transmissão
Em nosso segundo controlador, precisamos configurar o código para ouvir nossa transmissão
É realmente assim tão simples. Exemplo ao vivo
Outras maneiras de obter resultados semelhantes
Tente evitar o uso desse conjunto de métodos, pois ele não é eficiente nem fácil de manter, mas é uma maneira simples de corrigir problemas que você possa ter.
Geralmente, você pode fazer o mesmo usando um serviço ou simplificando seus controladores. Não discutiremos isso em detalhes, mas pensei em mencioná-lo por completo.
Por fim, lembre-se de que uma transmissão realmente útil para ouvir é '$ destroy' novamente. Você pode ver que $ significa que é um método ou objeto criado pelos códigos do fornecedor. De qualquer forma, $ destroy é transmitido quando um controlador é destruído. Você pode ouvir isso para saber quando seu controlador é removido.
fonte
fonte