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 falseal final de la funciónonclick, nong-click.Respuestas:
Lo que dijo @JosephSilber, o pasar el objeto $ event a la
ng-clickdevolució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 defineden 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-eventun atributo html? No pude encontrarlo en Mozilla Developer Network o en ningún otro lugar.angular-eat-eventdirectiva 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.checkboxenvuelto endivelemento. Midivtoma 12 columnas ycheckboxtoma 3 columnas. Quería llamar a una funciónAal hacer clicdivy a la funciónBal hacer cliccheckbox. así que cuando estaba haciendo clic encheckboxambas funciones se invocaban. Cuando agregong-click="$event.stopPropagation()"acheckbox, solo seBinvoca la función .stopPropagation()es detener la propagación del evento a los elementos principales. No estoy seguro de cómo lo está llamandoBya 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-clickcual modifica el comportamiento predeterminadong-clicky detiene la propagación del evento. De esta manera no tendría que agregar$event.stopPropagationa mano.fuente
Uso del controlador IN
fuente