Aquí hay un ejemplo. Digamos que quiero tener una superposición de imágenes como muchos sitios. Por lo tanto, cuando hace clic en una miniatura, aparece una superposición negra sobre toda la ventana y se centra una versión más grande de la imagen. Al hacer clic en la superposición negra, se descarta; Al hacer clic en la imagen, se llamará a una función que muestra la siguiente imagen.
El html:
<div ng-controller="OverlayCtrl" class="overlay" ng-click="hideOverlay()">
<img src="http://some_src" ng-click="nextImage()"/>
</div>
El javascript:
function OverlayCtrl($scope) {
$scope.hideOverlay = function() {
// Some code to hdie the overlay
}
$scope.nextImage = function() {
// Some code to find and display the next image
}
}
El problema es que con esta configuración, si hace clic en la imagen, tanto nextImage()
y hideOverlay()
recibe una llamada. Pero lo que quiero es que solo nextImage()
se me llame.
Sé que puedes capturar y cancelar el evento en la nextImage()
función de esta manera:
if (window.event) {
window.event.stopPropagation();
}
... Pero quiero saber si hay una mejor manera de hacerlo de AngularJS que no requiera que prefije todas las funciones de los elementos dentro de la superposición con este fragmento.
return false
al final de la funciónonclick
, nong-click
.Respuestas:
Lo que dijo @JosephSilber, o pasar el objeto $ event a la
ng-click
devolución de llamada y detener la propagación dentro de él:fuente
Uso
$event.stopPropagation()
:Aquí hay una demostración: http://plnkr.co/edit/3Pp3NFbGxy30srl8OBmQ?p=preview
fuente
ReferenceError: $event is not defined
en la consola.$event.stopPropagation()
en un lugar donde no funciona. Olvidé eliminarlo. Entonces, incluso cuando lo puse donde funcionó, se lo llamó por segunda vez donde no funcionó. Se deshizo del duplicado disfuncional y es exitoso. Gracias por tu ayuda.Me gusta la idea de usar una directiva para esto:
Luego use la directiva como:
Si lo desea, puede hacer que esta solución sea más genérica como esta respuesta a una pregunta diferente: https://stackoverflow.com/a/14547223/347216
fuente
stop-event
un atributo html? No pude encontrarlo en Mozilla Developer Network o en ningún otro lugar.angular-eat-event
directiva sobre Bower, que funciona de manera similar.A veces, puede tener más sentido hacer esto:
Elegí hacerlo de esta manera porque no quería
myClickHandler()
detener la propagación del evento en los muchos otros lugares donde se usaba.Claro, yo podría haber añadido un parámetro booleano a la función de controlador, pero
stopPropagation()
es mucho más significativo que simplementetrue
.fuente
$event.stopPropagation()
elementos internos.checkbox
envuelto endiv
elemento. Midiv
toma 12 columnas ycheckbox
toma 3 columnas. Quería llamar a una funciónA
al hacer clicdiv
y a la funciónB
al hacer cliccheckbox
. así que cuando estaba haciendo clic encheckbox
ambas funciones se invocaban. Cuando agregong-click="$event.stopPropagation()"
acheckbox
, solo seB
invoca la función .stopPropagation()
es detener la propagación del evento a los elementos principales. No estoy seguro de cómo lo está llamandoB
ya que no está en specififedng-click
, pero el punto de la respuesta es que se puede hacer esto:<checkbox ng-click="B(); $event.stopPropagation()">
. No tiene que incluir lastopPropagation()
función enB
.Esto funciona para mi:
fuente
Si no desea tener que agregar la detención de propagación a todos los enlaces, esto también funciona. Un poco más escalable.
fuente
event.target.classList.indexOf('overlay')
y ese truco funciona bien incluso cuando el div está anidado en otros divsSi inserta ng-click = "$ event.stopPropagation" en el elemento principal de su plantilla, se detendrá stopPropogation a medida que burbujea en el árbol, por lo que solo tiene que escribirlo una vez para toda la plantilla.
fuente
Puede registrar otra directiva además de la
ng-click
cual modifica el comportamiento predeterminadong-click
y detiene la propagación del evento. De esta manera no tendría que agregar$event.stopPropagation
a mano.fuente
Uso del controlador IN
fuente