可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
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