angular ng-messages 仅在 $touched 为真时显示
angular ng-messages only showing when $touched is true
我并没有做什么特别的事情。
我有一个输入要在每次击键时进行验证。如果验证失败,则显示错误。不要等待模糊事件触发 $touched.
我以为这是默认情况,但显然不是。我正在使用 angular 材料和 angular 消息。我这样做是为了大写锁定检测。
标记:
<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 个字符,错误对象说存在大写锁定错误,但由于 $touched 不正确,因此不会显示。
一旦 $touched 设置为 true,我就可以返回输入,一切都按预期进行。
有什么想法吗?提前致谢!
改变
<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">
或
<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">
或用于条件或检查:
<div ng-messages="primaryLogin.$error" ng-show="primaryLogin.login.$dirty || primaryLogin.login.$touched || primaryLogin.login.$pristine">
请逐一尝试上述方法,找出符合您情况的方法。
在 Angular Material 的 Pre 1.0 版本中(即 <= v0.11.4),情况是这样的:默认显示 ng-message。
然而,material design spec 指出:
Show error text only after user interaction with a field. If the user
inputs incorrect data, helper text may transform into error text.
如果您想在用户交互之前显示消息,您可以将 "md-auto-hide='false'" 添加到 ng-messages 指令。
<div ng-messages="primaryLogin.$error" md-auto-hide='false'></div>
我从以下位置找到了这个解决方案:here
检查ng-show="primaryLogin.login.$invalid && primaryLogin.login.$touched"
。这对我有用。
使用 md-is-error
示例:
<md-input-container md-is-error="true">
"When the given expression evaluates to true, the input container will go into error state. Defaults to erroring if the input has been touched and is invalid."
https://material.angularjs.org/1.1.3/api/directive/mdInputContainer
我并没有做什么特别的事情。
我有一个输入要在每次击键时进行验证。如果验证失败,则显示错误。不要等待模糊事件触发 $touched.
我以为这是默认情况,但显然不是。我正在使用 angular 材料和 angular 消息。我这样做是为了大写锁定检测。
标记:
<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 个字符,错误对象说存在大写锁定错误,但由于 $touched 不正确,因此不会显示。
一旦 $touched 设置为 true,我就可以返回输入,一切都按预期进行。
有什么想法吗?提前致谢!
改变
<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">
或
<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">
或用于条件或检查:
<div ng-messages="primaryLogin.$error" ng-show="primaryLogin.login.$dirty || primaryLogin.login.$touched || primaryLogin.login.$pristine">
请逐一尝试上述方法,找出符合您情况的方法。
在 Angular Material 的 Pre 1.0 版本中(即 <= v0.11.4),情况是这样的:默认显示 ng-message。
然而,material design spec 指出:
Show error text only after user interaction with a field. If the user inputs incorrect data, helper text may transform into error text.
如果您想在用户交互之前显示消息,您可以将 "md-auto-hide='false'" 添加到 ng-messages 指令。
<div ng-messages="primaryLogin.$error" md-auto-hide='false'></div>
我从以下位置找到了这个解决方案:here
检查ng-show="primaryLogin.login.$invalid && primaryLogin.login.$touched"
。这对我有用。
使用 md-is-error 示例:
<md-input-container md-is-error="true">
"When the given expression evaluates to true, the input container will go into error state. Defaults to erroring if the input has been touched and is invalid."
https://material.angularjs.org/1.1.3/api/directive/mdInputContainer