web-dev-qa-db-ja.com

ラジオボタン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

77
Spencer

ng-required="!color"を使用してみてください。これにより、値が設定されていない場合にのみフィールドが必要になります。値が設定されている場合、requiredは削除され、検証に合格します。

<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

更新

e-cloudの answer はシンプルで、追加のディレクティブを必要としません。可能であれば、誰もがこの方法を使用することをお勧めします。実用的なソリューションを提供し、ng-requiredディレクティブの使用方法を示しているため、この回答をここに残します。

122
dmullings

私はあなたが必要とするのはラジオグループの名前を追加することだと思います、ラジオ入力はそれが属するものを決定するための名前を必要とするため、下のリンクは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

93
e-cloud

ディレクティブを使用した代替ソリューション。 Firefox(v 33.0)では、受け入れられた答えが機能しませんでした。

アイデアは、変更時に特定のクラス名を持つすべての無線で必須属性をfalseに設定することでした。

  • jqliteの属性削除機能で問題が発生したため、jQueryが追加されました。
  • 元のプランカーから可能な限りコピーしました。

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>
0
jroot