Using checkboxes and required with AngularJS

匿名 (未验证) 提交于 2019-12-03 02:45:02

问题:

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.

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.

回答1:

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



回答2:

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:

JS



回答3:

I just added a hidden input with ng-model that's the same as your ng-model for the radio button:

 <div class="radio" ng-repeat="option in item.AnswerChoices | orderBy: DisplayOrder">         <input type="radio" ng-model="item.Answer" name="mulchoice" value="{{option.DisplayName}}" />         <span>{{option.DisplayName}}</span>     <input type="hidden" ng-model="item.Answer" name="hiddenradiobuttoninput" required/>  </div> 


回答4:

Why not make your checkbox models the array

<input type="checkbox" ng-model="value[$index]" value="{{choice.id}}/> 

Fiddle: http://jsfiddle.net/thbkA/1/



回答5:

<ul  class="list-group">   <li ng-repeat='animal in animals' class="list-group-item">     <label>       <input type="checkbox"         ng-model="xyx"         ng-click="toggleAnimal(animal)"         ng-checked="selectedAnimals.indexOf(animal) > -1"         ng-required="selectedAnimals.length == 0" />          {{animal}}</label>   </li>                   </ul>  $scope.toggleAnimal = function(animal){     var index = $scope.selectedAnimals.indexOf(animal);     if(index == -1) {       $scope.selectedAnimals.push(animal);     }     else{       $scope.selectedAnimals.splice(index, 1);     } } 

See the full detail and demo and other related examples



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!