AngularJSのグループチェックボックス検証
チェックボックスのリストがあり、そのうちの少なくとも1つは必須です。AngularJSのバリデーションでこれを実現しようとしたのですが、なかなかうまくいきません。以下は私のコードです。
// Code goes here for js
var app = angular.module('App', []);
function Ctrl($scope) {
$scope.formData = {};
$scope.formData.selectedGender = '';
$scope.gender = [{
'name': 'Male',
'id': 1
}, {
'name': 'Female',
'id': 2
}];
$scope.formData.selectedFruits = {};
$scope.fruits = [{
'name': 'Apple',
'id': 1
}, {
'name': 'Orange',
'id': 2
}, {
'name': 'Banana',
'id': 3
}, {
'name': 'Mango',
'id': 4
}, ];
$scope.submitForm = function() {
}
}
// Code goes here for html
<!doctype html>
<html ng-app="App">
<head>
<!-- css file -->
<!--App file -->
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.0.8/angular.js"></script>
<!-- External file -->
</head>
<body>
<div ng-controller="Ctrl">
<form class="Scroller-Container">
<div ng-app>
<form class="Scroller-Container" ng-submit="submit()" ng-controller="Ctrl">
<div>
What would you like?
<div ng-repeat="(key, val) in fruits">
<input type="checkbox" ng-model="formData.selectedFruits[val.id]" name="group[]" id="group[{{val.id}}]" required />{{val.name}}
</div>
<br />
<div ng-repeat="(key, val) in gender">
<input type="radio" ng-model="$parent.formData.selectedGender" name="formData.selectedGender" id="{{val.id}}" value="{{val.id}}" required />{{val.name}}
</div>
<br />
</div>
<pre>{{formData.selectedFruits}}</pre>
<input type="submit" id="submit" value="Submit" />
</form>
</div>
<br>
</form>
</div>
</body>
</html>
以下はplunkerのコードです。http://plnkr.co/edit/Bz9yhSoPYUNzFDpfASwt?p=preview AngularJSでこれを行った人はいますか?チェックボックスを必須にすると、すべてのチェックボックスの値を選択することを余儀なくされます。この問題は、AngularJSのドキュメントにも記載されていません。
52
3
グループ内の少なくとも1つの項目が選択されていることを必要とする場合、ng-requiredで動的なrequired属性を定義することが可能です。
性別のラジオボタンの場合、これは簡単でしょう。
チェックボックスグループも、配列を使って選択された果実を格納するのであれば簡単ですが(配列の長さをチェックするだけ)、オブジェクトの場合は、コントローラでフィルタや関数を使って、いずれかの値が真に設定されているかどうかをチェックする必要があります。
Update:
また、valueが0の場合はfalseを返すことに注意してください。
Klaster_1さん、快諾の回答ありがとうございます。チェックボックスの入力に
ng-change
を使ってローカルスコープ変数を設定し、それをng-required
式として使用することで、これを構築しました。これにより、すべてのダイジェストでsomeSelected()
が実行されるのを防ぐことができます。以下は、これを実演するプランクルです: http://embed.plnkr.co/ScqA4aqno5XFSp9n3q6d/
以下は後世に残すためのHTMLとJSです。
すべてのチェックボックスのインスタンスをトラバースすることなく、要件を実現することができます。 以下はサンプルコードです。
ここでは、javascriptのeval関数を"e"関数でラップしてアクセスするようにしています。