Voici un exemple. Disons que je veux avoir une superposition d'image comme beaucoup de sites. Ainsi, lorsque vous cliquez sur une vignette, une superposition noire apparaît sur toute votre fenêtre et une version plus grande de l'image y est centrée. Cliquer sur la superposition noire la rejette; cliquer sur l'image appellera une fonction qui affiche l'image suivante.
Le html:
<div ng-controller="OverlayCtrl" class="overlay" ng-click="hideOverlay()">
<img src="http://some_src" ng-click="nextImage()"/>
</div>
Le 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
}
}
Le problème est qu'avec cette configuration, si vous cliquez sur l'image, les deux nextImage()
et hideOverlay()
sont appelés. Mais ce que je veux, c'est seulement nextImage()
être appelé.
Je sais que vous pouvez capturer et annuler l'événement dans la nextImage()
fonction comme ceci:
if (window.event) {
window.event.stopPropagation();
}
... Mais je veux savoir s'il existe une meilleure façon AngularJS de le faire qui ne m'obligera pas à préfixer toutes les fonctions sur les éléments à l'intérieur de la superposition avec cet extrait de code.
return false
à la fin de la fonctiononclick
, nonng-click
.Réponses:
Ce que @JosephSilber a dit, ou passez l'objet $ event en
ng-click
callback et arrêtez la propagation à l'intérieur de celui-ci:la source
Utilisez
$event.stopPropagation()
:Voici une démo: http://plnkr.co/edit/3Pp3NFbGxy30srl8OBmQ?p=preview
la source
ReferenceError: $event is not defined
dans la console.$event.stopPropagation()
dans un endroit où cela ne fonctionne pas. J'ai oublié de le supprimer. Donc, même quand je l'ai mis là où ça fonctionnait, on l'appelait une deuxième fois là où ça ne fonctionnait pas. Débarrassez-vous du double dysfonctionnel et c'est réussi. Merci de votre aide.J'aime l'idée d'utiliser une directive pour cela:
Ensuite, utilisez la directive comme:
Si vous le souhaitez, vous pouvez rendre cette solution plus générique comme cette réponse à une autre question: https://stackoverflow.com/a/14547223/347216
la source
stop-event
un attribut html? Je n'ai pas pu le trouver sur Mozilla Developer Network ou ailleurs.angular-eat-event
directive sur le bower, qui fonctionne de manière similaire!Parfois, il peut être plus judicieux de faire ceci:
J'ai choisi de le faire de cette façon parce que je ne voulais
myClickHandler()
pas arrêter la propagation de l'événement dans les nombreux autres endroits où il était utilisé.Bien sûr, j'aurais pu ajouter un paramètre booléen à la fonction de gestionnaire, mais
stopPropagation()
c'est beaucoup plus significatif que justetrue
.la source
$event.stopPropagation()
des éléments internes.checkbox
enveloppé d'div
élément. Mondiv
prend 12 colonnes etcheckbox
prend par exemple 3 colonnes. Je voulais appeler une fonctionA
en un clicdiv
et une fonctionB
en un cliccheckbox
. donc quand je cliquais, lescheckbox
deux fonctions étaient appelées. Quand j'ajouteng-click="$event.stopPropagation()"
àcheckbox
, je n'ai qu'une fonctionB
invoquée.stopPropagation()
est d'arrêter la propagation de l'événement aux éléments parents. Je ne sais pas comment vous appelezB
car il est pas specififed dansng-click
, mais le point de la réponse est que vous pouvez le faire:<checkbox ng-click="B(); $event.stopPropagation()">
. Vous n'êtes pas obligé d'inclure lastopPropagation()
fonction dansB
.Cela fonctionne pour moi:
la source
Si vous ne voulez pas avoir à ajouter la propagation d'arrêt à tous les liens, cela fonctionne également. Un peu plus évolutif.
la source
event.target.classList.indexOf('overlay')
Et cette astuce fonctionne bien même lorsque le div est imbriqué dans d'autres divsSi vous insérez ng-click = "$ event.stopPropagation" sur l'élément parent de votre modèle, stopPropogation sera intercepté au fur et à mesure qu'il remontera dans l'arborescence, vous n'aurez donc à l'écrire qu'une seule fois pour tout votre modèle.
la source
Vous pouvez enregistrer une autre directive en plus de
ng-click
laquelle modifie le comportement par défaut deng-click
et arrête la propagation de l'événement. De cette façon, vous n'aurez pas à ajouter$event.stopPropagation
manuellement.la source
Utilisation du contrôleur IN
la source