Подтвердить что ты не робот

Использование флажков и требуется с помощью AngularJS

Я попытался использовать атрибут html5 required для моей группы флажков, но я не нашел хороший способ реализовать его с помощью ng-формы.

Когда флажок установлен, я хочу, чтобы значение этого входного элемента было перенесено в массив значений.

Требуемый валидатор angular, похоже, наблюдает за ng-моделью, связанной с элементом ввода, но как я могу связать несколько флажков с одной и той же моделью и обновить ее значение со значением поля ввода?

В настоящее время реализация похожа на эту скрипту.

<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>​

Функция updateQuestionValue обрабатывает добавление или удаление из массива значений, но каждый флажок имеет свою собственную модель, и поэтому каждый флажок должен быть проверен, чтобы форма была действительной.

У меня есть работа над группой переключателей, но все они работают на той же модели, что и только один.

4b9b3361

Ответ 1

Если вы хотите, чтобы кнопка отправки была отключена, если выбор не выбран, самым простым способом является проверка длины массива в атрибуте ng-disabled без установки требуемого атрибута

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

Смотрите здесь обновленную скрипту

Другой способ сделать это - проверить длину массива в ng-обязательном атрибуте флажков

<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" />

Вторая скрипка

Ответ 2

Несколько вещей:

  • Я бы пошел с подходом, который просто обновил весь массив в этом случае, так как это немного упростило бы код. (Возможно, вы не захотите этого делать, если вы делаете что-то с состоянием с содержимым массива $scope.value, но оно не похоже на вас).
  • вы можете просто использовать <form>, а не <ng-form>.
  • переместите функцию отправки на кнопку ng-click и в форму ng-submit. Это упрощает управление проверкой с помощью angular встроенной проверки (если вам это интересно)
  • Если ваш <label> обертывает ваш <input>, вам не нужен атрибут for="".

Вот обновленная скрипка для вас

И вот код:

<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;
        });
    };
}​

Ответ 3

Я просто добавил скрытый ввод с ng-моделью, что и ваша ng-модель для переключателя:

 <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

Почему бы не сделать ваши флажки моделей массивом

<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);
    }
}

См. полную информацию и демо и другие связанные примеры