仅在$ touch为true时显示的角度ng-messages

时间:2015-12-16 23:48:35

标签: javascript angularjs angular-material ng-messages

我没有做太特别的事。

我有一个输入,我希望每次按键都验证。如果验证失败,则显示错误。不要等待模糊事件触发$ 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,我就可以回到输入中,一切都按预期工作。

有什么想法吗?提前谢谢!

4 个答案:

答案 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