How to prevent ng-click's triggering twice on label tag?
Use ng-change="updateSelected"
Use this only on the input since the change is triggered even if you click the label.
Well thats because label
is the parent or container for the checkbox
, so the click
handler is attached to the complete container in your case, thereby whenever either label
or checkbox
is clicked, event is triggered.
Whats wrong with your approach:
- Firstly never insert the input tags inside the label, thats not a good way to construct markup in html.In
Angular.js
this behaviour causes the click event to be triggered for both the tags. so to add a binding betweeninput
tag &label
use thefor
attribute of label. - Using
$event.stopPropagation()
inside label actually stops all events from propagating/boiling to the top of the DOM from the label. this will not serve any purpose because the event would still propagate to the input with in the label.
I hope you can visualise what i'm saying.
What I have done:
- Use
for
attribute to bind theinput
to the label & add aclick
event to prevent the default functionality. Add the click handler to the respective
input
tag & not thelabel
<label for="username" ng-click="$event.preventDefault();">Click me</label> <input type="text" id="username" ng-click="updateSelected();">
Live Demo @ JSFiddle
This way you don't have to worry about any conflicts in event handling,also its neat way to maintain the HTML code :)