2017-09-26 1 views
0

Je suis confronté au problème parce que j'ai une case à cocher dans un div et je veux appeler une fonction dans les deux cas: si nous changeons la valeur de la case à cocher ou cliquez sur la div.Émission répétée d'événement avec ng-clic dans div imbriqué

Maintenant, le problème est que, lorsque je clique sur la case à cocher, l'événement est renvoyé deux fois et je n'obtiens pas le résultat attendu.

<div ng-click="checkEntry(config.id)"><input type="checkbox" ng-model="modelCheckbox" ng-change="checkEntry(config.id)" ng-checked="someArray.indexOf(config.id) !== -1"></div> 

$scope.checkEntry = function(id){ 
    var idx = $scope.someArray.indexOf(id); 
    if(idx === -1){ 
     $scope.someArray.push(id); 
    }else{ 
     $scope.someArray.splice(idx, 1); 
    } 
} 

Maintenant, si je clique sur div, cela fonctionne très bien et la case est cochée. Mais si je clique sur le checkBox, la fonction est appelée deux fois, et cela ne fonctionne pas comme prévu.

S'il vous plaît me aider avec une solution

+1

essayer d'ajouter 'event.stopPropagation $()' 'avec ng-click' de div –

+0

lorsque votre case à cocher est cliqué. son événement cliqué est renvoyé. et son a été propagé à l'élément parent. élément qui se trouve dans la hiérarchie parent et auquel un événement click est associé, ils capturent également ces événements. C'est ce qu'on appelle le bouillonnement d'événements. par conséquent, vous devez appeler $ event.stopPropagation() sur votre case à cocher ng-click. –

Répondre

2

Vous n'avez pas besoin de deux gestionnaires d'événements pour deux événements identiques. Lorsque vous cliquez sur l'entrée, le div sera également cliqué. il suffit donc de supprimer ng-change de votre code.

<div ng-click="checkEntry(config.id)">test 
<input type="checkbox" ng-model="modelCheckbox" ng-checked="checked"> 

et dans votre contrôleur:

$scope.checked = true; 
$scope.checkEntry = function(id){ 
    $scope.checked = !$scope.checked; 
} 

Regardez this plunker

+0

Fonctionne comme par magie et est si simple. Merci Yamin –

0

Checkbox est situé à l'intérieur de cette div, donc lorsque vous cliquez sur la case que vous cliquez sur div en fait aussi. En fait, dans votre cas, vous pouvez supprimer ng-change attribut de case à cocher et cela fonctionnera toujours, car la fonction sera appelée via un clic sur div quand même. Mais ce n'est pas correct de travailler avec des cases à cocher!

Première question ici est si vous avez vraiment besoin de div? Je préfère utiliser l'étiquette à la place:

<label for="my-checkbox"><input id="my-checkbox" type="checkbox" ng-model="modelCheckbox" ng-change="checkEntry(config.id)" ng-checked="someArray.indexOf(config.id) !== -1"></label> 

Dans ce cas, il fonctionne très bien, il vous suffit d'écrire une bonne style CSS pour cette étiquette correctement. C'est la meilleure solution et la plus correcte.

+0

Je n'arrive pas à comprendre pourquoi cette réponse est downvoted. Pas d'explications:/ Cette réponse et Yarmins sont correctes, mais le plus inconvinient est marqué comme une solution. –

+0

votre solution fonctionne, mais peut-être je me suis trompé quelque part lors de la mise en œuvre qui est pourquoi ne pas obtenir le résultat attendu. par conséquent^1 –

+0

Donc cela fonctionne pour vous maintenant, ou quelque chose ne va pas? Si oui, quoi exactement? –