Dans l'exemple suivant:
<li ng-repeat="item in items" ng-click="showItem(item)">
<h3>{{item.title}}</h3>
<button ng-click="remove(item)">Remove</button>
</li>
Lorsque je clique sur le bouton showItem()
est également invoqué en raison de la propagation d'événements. Je sais que je peux utiliser $event
Pour surveiller $event.currentTarget
Et faire $event.stopPropagation()
etc. mais c'est très moche.
Btw. Je ne veux pas arrêter la propagation sur le button
(dans mon cas, le button
est un Twitter bootstrap
dopdown/button
- ce n'est qu'un exemple)
Comment puis-je empêcher showItem()
d'être appelé lorsque je clique sur le bouton remove
?
EDIT La mauvaise solution serait d'avoir:
function remove(item,$event){
$event.originalEvent.prevent = true;
// rest of the code
}
function showItem(item,$event){
if($event.originalEvent.prevent)return;
// rest of the code
}
Cette solution a fonctionné pour moi (je ne supporte que les navigateurs récents, j'ai donc essayé de modifier le code pour être plus rétro-compatible):
HTML:
<li ng-repeat="item in items" ng-click="showItem(item)">
<h3>{{item.title}}</h3>
<button ng-click="remove(item, $event)">Remove</button>
</li>
Scripts:
function remove(item, $event) {
// do some code here
// Prevent bubbling to showItem.
// On recent browsers, only $event.stopPropagation() is needed
if ($event.stopPropagation) $event.stopPropagation();
if ($event.preventDefault) $event.preventDefault();
$event.cancelBubble = true;
$event.returnValue = false;
}
function showItem(item) {
// code here
}
[~ # ~] modifier [~ # ~] - Ajout d'une démo JSFiddle pour l'essayer http://jsfiddle.net/ 24e7mapp/1 /
showItem
peut être mis à jour pour revenir plus tôt si le passé dans item
n'existe plus:
function remove(item) {
if (-1 == $scope.items.indexOf(item)) {
// Item no longer exists, return early
return;
}
// Rest of code here
}