回答:
各入力name
の検証情報は、form
の名前のプロパティとして公開されますscope
。
HTML
<form name="someForm" action="/">
<input name="username" required />
<input name="password" type="password" required />
</form>
JS
$scope.someForm.username.$valid
// > false
$scope.someForm.password.$error
// > { required: true }
公開されたプロパティは$pristine
、$dirty
、$valid
、$invalid
、$error
。
何らかの理由でエラーを繰り返し処理したい場合:
$scope.someForm.$error
// > { required: [{$name: "username", $error: true /*...*/},
// {$name: "password", /*..*/}] }
エラーのある各ルールは$ errorで公開されます。
ここにhttp://plnkr.co/edit/zCircDauLfeMcMUSnYaO?p=previewで遊ぶplunkrがあります
ループできますform.$error.pattern
。
$scope.updateProfile = function() {
var error = $scope.profileForm.$error;
angular.forEach(error.pattern, function(field){
if(field.$invalid){
var fieldName = field.$name;
....
}
});
}
無効なフィールドがある場合、その値を取得しようとすると、になりますundefined
。
あなたが$scope.mynum
それに接続されたテキスト入力を持っていて、あなたがそれをタイプしたときだけ有効であるとしましょうABC
。
の値を取得しようとすると$scope.mynum
、次のようになりますundefined
。は返されませんABC
。
(おそらくあなたはこれすべてを知っていますが、とにかく)
したがって、スコープに追加した検証が必要なすべての要素を含む配列を使用し、フィルター(たとえば、underscore.js)を使用して、どの要素が typeof
undefined
。
そして、それらは無効な状態を引き起こすフィールドです。
無効になっている[保存]ボタンのツールチップにすべてのエラーを表示したかったので、ユーザーは長いフォームを上下にスクロールする代わりに無効になっている理由を知ることができます。
if (frm) {
disable = frm.$invalid;
if (frm.$invalid && frm.$error && frm.$error.required) {
frm.$error.required.forEach(function (error) {
disableArray.push(error.$name + ' is required');
});
}
}
if (disableArray.length > 0) {
vm.disableMessage = disableArray.toString();
}
私のアプリケーションでは、次のようなエラーが表示されます。
<ul ng-repeat="errs in myForm.$error">
<li ng-repeat="err in errs">{{err.$name}}</li></ul>
すべてを見たい場合は、次のように表示されるユーザー「err」だけです。
"$validators": {},
"$asyncValidators": {},
"$parsers": [],
"$formatters": [],
"$viewChangeListeners": [],
"$untouched": true,
"$touched": false,
"$pristine": true,
"$dirty": false,
"$valid": false,
"$invalid": true,
"$error": { "required": true },
"$name": "errorfieldName",
"$options": {}
これはうまくフォーマットされていませんが、これらのものがそこに表示されます...
name
(もちろん)$ nameでそれを見るには、入力の属性を指定する必要があります。AngularJSが名前を必要とせずにモデルプロパティにバインドするという事実は、どの入力が無効であるかを診断することを難しくする可能性があります。