Non sto facendo nulla di troppo speciale.
Ho un input che desidero convalidato con ogni tratto di tasto. Se la convalida fallisce, visualizza l'errore. Non aspettare che l'evento di sfocatura faccia scattare il $ toccato.
Ho pensato che fosse il caso predefinito, ma a quanto pare non lo è. Sto usando materiali angolari insieme a messaggi angolari. Lo sto facendo per il rilevamento di capslock.
Il markup:
<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>
Quando ho vengo alla pagina, attivare il blocco maiuscole, e iniziare a digitare, il mio messaggio di errore sembra in questo modo:
{
"$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
}
}
}
Quindi questo sembra essere funziona come previsto, ma il messaggio di errore effettivo non viene visualizzato fino a quando l'evento di sfocatura non viene attivato su quell'input specifico. Quindi posso entrare con capslock, digitare 10 caratteri, l'oggetto error dice che l'errore di capslock è presente, ma poiché $ ha toccato non è vero, quindi non mostra.
Una volta $ touched è impostato su true, quindi posso tornare all'input e tutto funziona come previsto.
Qualche idea? Grazie in anticipo!
Qual è l'attributo 'capslock'? – tasseKATT
@tasseKATT L'attributo capslock è una direttiva personalizzata per il rilevamento di capslock. Ha il proprio stato di errore per visualizzare i messaggi. – TyMayn
Nota: in genere quando si desidera forzare le persone a utilizzare lettere minuscole, basta forzare le lettere minuscole anziché la convalida, vedere http://stackoverflow.com/questions/16388562/angularjs-force-uppercase-in-textbox – Walfrat