Tengo un footerController y codeScannerController con diferentes vistas.
angular.module('myApp').controller('footerController', ["$scope", function($scope) {}]);
angular.module('myApp').controller('codeScannerController', ["$scope", function($scope) {
console.log("start");
$scope.startScanner = function(){...
Cuando hago clic en a <li>
en footer.html, debería obtener este evento en codeScannerController.
<li class="button" ng-click="startScanner()">3</li>
Creo que se puede realizar con $on
y $broadcast
, pero no sé cómo y no puedo encontrar ejemplos en ningún lado.
javascript
angularjs
Alice Polansky
fuente
fuente
$scope.$apply()
solo es necesario cuando se cambia el modelo fuera del marco angular (como en un setTimeout, una devolución de llamada de diálogo o una devolución de llamada ajax), en otras palabras,$apply()
ya se activa después de que todo el código.$on()
haya finalizado.En primer lugar, una breve descripción de
$on()
,$broadcast()
y$emit()
:.$on(name, listener)
- Escucha un evento específico por un determinadoname
.$broadcast(name, args)
- Transmita un evento a través$scope
de todos los niños.$emit(name, args)
- Emitir un evento en la$scope
jerarquía a todos los padres, incluido el$rootScope
Basado en el siguiente HTML (vea el ejemplo completo aquí ):
Los eventos disparados atravesarán lo
$scopes
siguiente:$scope
$scope
Entonces será visto por el Controlador 1$rootScope
$scope
luego por el controlador 3$scope
$scope
Entonces será visto por el Controlador 2$rootScope
$scope
$scope
, el controlador 2 y$scope
luego$rootScope
$rootScope
y$scope
de todos los controladores (1, 2 y luego 3)$rootScope
JavaScript para desencadenar eventos (de nuevo, puede ver un ejemplo de trabajo aquí ):
fuente
Una cosa que debes saber es que el prefijo $ se refiere a un Método Angular, los prefijos $$ se refieren a métodos angulares que debes evitar.
A continuación se muestra una plantilla de ejemplo y sus controladores, exploraremos cómo $ broadcast / $ on puede ayudarnos a lograr lo que queremos.
Los controladores son
Mi pregunta para usted es ¿cómo pasa el nombre al segundo controlador cuando un usuario hace clic en registrarse? Puede encontrar múltiples soluciones, pero la que vamos a usar es usar $ broadcast y $ on.
$ broadcast vs $ emit
¿Cuál deberíamos usar? $ broadcast canalizará a todos los elementos dom de los niños y $ emit canalizará la dirección opuesta a todos los elementos dom ancestrales.
La mejor manera de evitar decidir entre $ emit o $ broadcast es canalizar desde $ rootScope y usar $ broadcast para todos sus hijos. Lo que hace que nuestro caso sea mucho más fácil ya que nuestros elementos dom son hermanos.
Agregar $ rootScope y permite $ broadcast
Tenga en cuenta que agregamos $ rootScope y ahora estamos usando $ broadcast (broadcastName, argumentos). Para broadcastName, queremos darle un nombre único para que podamos capturar ese nombre en nuestro secondCtrl. ¡He elegido BOOM! solo por diversión. Los segundos argumentos 'argumentos' nos permiten pasar valores a los oyentes.
Recibiendo nuestra transmisión
En nuestro segundo controlador, necesitamos configurar el código para escuchar nuestra transmisión
Es realmente así de simple. Ejemplo en vivo
Otras formas de lograr resultados similares
Intente evitar el uso de este conjunto de métodos, ya que no es ni eficiente ni fácil de mantener, pero es una forma sencilla de solucionar los problemas que pueda tener.
Por lo general, puede hacer lo mismo utilizando un servicio o simplificando sus controladores. No discutiremos esto en detalle, pero pensé en mencionarlo por completo.
Por último, tenga en cuenta que una transmisión realmente útil para escuchar es '$ destroy' nuevamente, puede ver que $ significa que es un método u objeto creado por los códigos de proveedor. De todos modos, $ destroy se transmite cuando se destruye un controlador, es posible que desee escuchar esto para saber cuándo se retira su controlador.
fuente
fuente