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

Подтверждение радио кнопки AngularJS

Кажется, это должно быть довольно легко, но я не нахожу ответа. У меня есть форма, где мне нужно подтвердить, что выбор сделан из группы радио. Я попытался использовать атрибут "required" на переключателях, но когда форма проверена, она жалуется, если не выбраны все радиокномы (что невозможно по дизайну).

Каков правильный способ проверки выбора радиогруппы в AngularJS?

<form name="myForm" ng-submit="submitForm()" ng-controller="ExampleController">
  <input type="radio" ng-model="color" value="red" required>  Red <br/>
  <input type="radio" ng-model="color" value="green" required> Green <br/>
  <input type="radio" ng-model="color" value="blue" required> Blue <br/>
  <tt>color = {{color | json}}</tt><br/>
  <button type="submit">Submit</button>
</form>

Нажатие кнопки отправки в Plnkr показывает поведение.

http://plnkr.co/edit/3qcIbMvJk19OvokcHe2N?p=preview

4b9b3361

Ответ 1

Попробуйте использовать ng-required="!color". Это делает это поле обязательным, только если значение не установлено. Если установлено значение, то обязательное удаляется и проходит проверку.

<input type="radio" ng-model="color" value="red" ng-required="!color">  Red <br/>
<input type="radio" ng-model="color" value="green" ng-required="!color"> Green <br/>
<input type="radio" ng-model="color" value="blue" ng-required="!color"> Blue <br/>

Вот обновленный плункер, который демонстрирует, что форма теперь проверяется правильно: http://plnkr.co/edit/EdItU2IIkO1KIsC052Xx?p=preview

Обновление

Электронное облако ответ прост и не требует дополнительной директивы. Я предлагаю всем использовать этот метод, если это возможно. Оставив этот ответ здесь, он дает рабочее решение и демонстрирует использование директивы ng-required.

Ответ 2

Я думаю, что вам нужно добавить имя для радиогруппы, поскольку для радиоввода нужно имя, чтобы определить, к чему он принадлежит, ссылка ниже работает с валидацией без ng-required (принятый ответ)

<input type="radio" name='group' ng-model="color" value="red" required>  Red <br/>
<input type="radio" name='group' ng-model="color" value="green" required> Green <br/>
<input type="radio" name='group' ng-model="color" value="blue" required> Blue <br/>

http://plnkr.co/edit/LdgAywfC6mu7gL9SxPpC?p=preview

Ответ 3

Альтернативное решение с использованием директивы. Принятый ответ не работал у меня в Firefox (v 33.0).

Идея состояла в том, чтобы установить требуемый атрибут на false на всех радиостанциях с определенным именем класса при изменении.

  • Добавлен jQuery, потому что у меня возникли проблемы с функцией jqlite remove attribute.
  • Я скопировал как можно больше из исходного плункера.

http://plnkr.co/edit/nbzjQqCAvwNmkbLW5bxN?p=preview

<!doctype html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Example - example-radio-input-directive-production</title>
  <script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
  <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.3.0-beta.14/angular.min.js"></script>
</head>
<body ng-app="radioExample">
  <script>
    angular.module('radioExample', [])
    .controller('ExampleController', ['$scope', function($scope) {
      $scope.myObject= {};

      $scope.specialValue = {
        "id": "12345",
        "value": "green"
      };

      $scope.submitForm = function() {
        alert('valid');
      }

    }])
    .directive('colorChoice', function() {
      return {
        restrict: 'E',
        template: '<div ng-repeat="c in colors"><input class="colorClass" type="radio" value={{c}} ng-model="myObject.color" required />{{c}}</div>',
        link: function(scope, element, attrs) {
          scope.colors = ['Red', 'Green', 'Blue'];

          element.on('change', function(){
            $(".colorClass").attr("required", false);
          });
        }
      }
    });
  </script>
  <form name="myForm" ng-submit="submitForm()" ng-controller="ExampleController">
    <color-choice></color-choice>
    <tt>color = {{myObject.color | json}}</tt><br/>
    <button type="submit">Submit</button>
  </form>

</body>
</html>

Ответ 4

В моем случае я использовал библиотеку материалов angularJS и добавил атрибут required в тег <md-radio=group>.