あまり特別なことをしているわけではありません。
キーストロークごとに検証したい入力があります。検証に失敗した場合は、エラーを表示します。ぼかしイベントが $touched をトリガーするのを待たないでください。
これがデフォルトのケースだと思っていましたが、どうやらそうではないようです。角度のあるメッセージとともに角度のある素材を使用しています。capslock 検出のためにこれを行っています。
マークアップ:
<form name="primaryLogin" novalidate>
<md-content layout-padding layout="column">
<md-input-container flex>
<label>Login ID</label>
<input type="text" required="" name="login" ng-model="primary.loginID" capslock>
<div ng-messages="primaryLogin.$error">
<div ng-message="required">
Please enter a Login ID.
</div>
<div ng-message="capslock">
Caps Lock is ON!
</div>
</div>
<pre>{{ primaryLogin | json }}</pre>
</md-input-container>
</md-content>
</form>
最初にページにアクセスし、Caps Lock をオンにして入力を開始すると、次のようなエラー メッセージが表示されます。
{
"$error": {
"capslock": [
{
"$viewValue": "Q",
"$validators": {},
"$asyncValidators": {},
"$parsers": [
null
],
"$formatters": [
null,
null
],
"$viewChangeListeners": [],
"$untouched": false,
"$touched": true,
"$pristine": false,
"$dirty": true,
"$valid": false,
"$invalid": true,
"$error": {
"capslock": true
},
"$name": "login",
"$options": {
"debounce": 100,
"updateOnDefault": true
}
}
]
},
"$name": "primaryLogin",
"$dirty": true,
"$pristine": false,
"$valid": false,
"$invalid": true,
"$submitted": false,
"login": {
"$viewValue": "Q",
"$validators": {},
"$asyncValidators": {},
"$parsers": [
null
],
"$formatters": [
null,
null
],
"$viewChangeListeners": [],
"$untouched": true,
"$touched": false,
"$pristine": false,
"$dirty": true,
"$valid": false,
"$invalid": true,
"$error": {
"capslock": true
},
"$name": "login",
"$options": {
"debounce": 100,
"updateOnDefault": true
}
}
}
したがって、これは期待どおりに機能しているように見えますが、実際のエラー メッセージは、その特定の入力でぼかしイベントが発生するまで表示されません。したがって、capslock を入力して 10 文字を入力すると、エラー オブジェクトは capslock エラーがあることを示します、しかし $touched は true ではないため、表示されません。
$touched が true に設定されると、入力に戻ることができ、すべてが期待どおりに機能します。
何か案は?前もって感謝します!