Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using checkboxes and required with AngularJS

I've tried to use the html5 required attribute for my group of checkboxes but I don't find a nice way to implement it with ng-form.

When a checkbox is checked I want the value of that input-element to be pushed to an array of values.

The angular required validator seems to watch the ng-model associated with the input element, but how can I link several checkboxes to the same model and update it's value with the value of the input field?

Right now the implementation is like this fiddle.

<div ng-controller="myCtrl">   <ng-form name="myForm">     <span ng-repeat="choice in choices">       <label class="checkbox" for="{{choice.id}}">         <input type="checkbox" required="required" value="{{choice.id}}" ng-click="updateQuestionValue(choice)" ng-model="choice.checked" name="group-one" id="{{choice.id}}" />         {{choice.label}}       </label>     </span>     <input type="submit" value="Send" ng-click="submitSurvey(survey)" ng-disabled="myForm.$invalid" />   </ng-form> </div>​ 

The updateQuestionValue-function handles the adding or removing from the array of values but each checkbox has it's own model and that is why each checkbox needs to be checked in order for the form to be valid.

I've got it to work on a group of radio buttons, but they all work on the same model as only one can be selected.

like image 762
Tryggve Avatar asked Nov 26 '12 14:11

Tryggve


People also ask

How to validate checkbox in angular JS?

Inside the function, a FOR loop is executed over the JSON array and the Selected property of each CheckBox is verified whether it is True. If at-least one CheckBox is checked, then the validation is successful else an error message is displayed using AngularJS.

How to bind checkbox in AngularJS?

It updates the array when the checkboxes change, and updates the checkboxes when the array changes. app. directive('checkList', function() { return { scope: { list: '=checkList', value: '@' }, link: function(scope, elem, attrs) { var handler = function(setup) { var checked = elem. prop('checked'); var index = scope.

How do I make a checkbox readonly in AngularJS?

How do I make a checkbox readonly in AngularJS? AngularJS ng-readonly Directive The ng-readonly directive sets the readonly attribute of a form field (input or textarea). The form field will be readonly if the expression inside the ng-readonly attribute returns true.

How do I check if a checkbox is checked in AngularJS?

The ng-checked Directive in AngularJS is used to read the checked or unchecked state of the checkbox or radio button to true or false. If the expression inside the ng-checked attribute returns true then the checkbox/radio button will be checked otherwise it will be unchecked.


2 Answers

If you want the submit button disabled if no choice is selected the easiest way is to check the length of the array in the ng-disabled attribute, without setting the required attribute

<input type="submit" value="Send" ng-click="submitSurvey(survey)"   ng-disabled="value.length==0" /> 

See here for updated fiddle

Another way to do this would be to check the array length in the ng-required attribute of the checkboxes

<input type="checkbox" value="{{choice.id}}" ng-click="updateQuestionValue(choice)"   ng-model="choice.checked" name="group-one" id="{{choice.id}}"    ng-required="value.length==0" /> 

Second fiddle

like image 116
tocallaghan Avatar answered Sep 21 '22 11:09

tocallaghan


A few things:

  • I would go with an approach that just updated the entire array in this case, as it would simplify the code a little. (You might not want to do this if you're doing anything stateful with the $scope.value array contents, but it doesn't look like you are).
  • you can just use <form> rather than <ng-form>.
  • move the submit function off of the button's ng-click and into the form's ng-submit. This makes validation management a little easier with angular's built-in validation (if you care about that)
  • If your <label> wraps your <input> you don't need the for="" attribute.

Here is an updated fiddle for you

And here's the code:

<div ng-controller="myCtrl">     <form name="myForm" ng-submit="submitSurvey(survey)">         <span ng-repeat="choice in choices">             <label class="checkbox">             <input type="checkbox" required="required" value="{{choice.id}}" ng-change="updateQuestionValues()" ng-model="choice.checked" name="group-one" />                 {{choice.label}}             </label>         </span>         <input type="submit" value="Send" ng-disabled="myForm.$invalid" />     </form>     {{value}} </div>​ 

JS

function myCtrl($scope) {      $scope.choices = [{         "id": 1,         "value": "1",         "label": "Good"},     {         "id": 2,         "value": "2",         "label": "Ok"},     {         "id": 3,         "value": "3",         "label": "Bad"}];      $scope.value = [];      $scope.updateQuestionValues = function() {         $scope.value = _.filter($scope.choices, function(c) {             return c.checked;         });     }; }​ 
like image 30
Ben Lesh Avatar answered Sep 23 '22 11:09

Ben Lesh