我没有做太特别的事。
我有一个输入,我希望每次按键都验证。如果验证失败,则显示错误。不要等待模糊事件触发$ touch。
我认为这是默认情况,但显然不是。我使用角度材料和角度消息。我正在为封锁检测做这件事。
标记:
<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>
当我第一次来到该页面时,打开大写锁定,然后开始输入,我的错误消息如下:
{
"$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
}
}
}
所以这似乎按预期工作,但实际的错误信息不会显示,直到模糊事件触发该特定输入..所以我可以使用大写,输入10个字符,错误对象说封锁错误是存在的,但由于$ touch不是真的,所以它没有显示。
一旦$ touch设置为true,我就可以回到输入中,一切都按预期工作。
有什么想法吗?提前谢谢!
答案 0 :(得分:21)
更改
<div ng-messages="primaryLogin.$error">
到
<div ng-messages="primaryLogin.$error" ng-show="primaryLogin.login.$dirty">
您也可以尝试
<div ng-messages="primaryLogin.$error" ng-show="primaryLogin.login.$touched">
OR
<div ng-messages="primaryLogin.$error" ng-show="primaryLogin.login.$pristine">
你也可以像这样对他们进行条件和检查:
<div ng-messages="primaryLogin.$error" ng-show="primaryLogin.login.$dirty && primaryLogin.login.$touched && primaryLogin.login.$pristine">
或有条件的OR检查:
<div ng-messages="primaryLogin.$error" ng-show="primaryLogin.login.$dirty || primaryLogin.login.$touched || primaryLogin.login.$pristine">
逐一尝试以上,找出符合您案例的人。
答案 1 :(得分:4)
在Angular Material的Pre 1.0版本中(即&lt; = v0.11.4),情况就是如此:默认显示ng-message。
然而,material design spec州:
仅在用户与字段交互后显示错误文本。如果是用户 输入不正确的数据,辅助文本可能会转换为错误文本。
如果您想在用户交互之前显示消息,可以在ng-messages指令中添加“md-auto-hide ='false'”。
<div ng-messages="primaryLogin.$error" md-auto-hide='false'></div>
我从here
找到了这个解决方案答案 2 :(得分:1)
查看ng-show="primaryLogin.login.$invalid && primaryLogin.login.$touched"
。这对我有用。
答案 3 :(得分:1)
使用md-is-error 为例:
<md-input-container md-is-error="true">
“当给定的表达式计算结果为true时,输入容器将进入错误状态。如果输入被触摸且无效,则默认为错误。”
https://material.angularjs.org/1.1.3/api/directive/mdInputContainer