угловые сообщения ng, показывающие только когда $ touched верно
Я не делаю ничего особенного.
У меня есть вход, который я хочу проверить с каждым нажатием клавиши. Если проверка не выполнена, отобразите ошибку. Не ждите, пока событие размытия вызовет нажатие кнопки $.
Я думал, что это случай по умолчанию, но, видимо, это не так. Я использую угловые материалы вместе с угловыми сообщениями. Я делаю это для обнаружения каплексов.
Разметка:
<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
}
}
}
Таким образом, похоже, что он работает так, как ожидалось, но фактическое сообщение об ошибке не отображается, пока событие blur не срабатывает на этом конкретном входе. Поэтому я могу входить с caplock, типа 10 символов, объект ошибки говорит, что ошибка в кэксе, но поскольку $ touched не соответствует действительности, то это не отображается.
Когда значение $ touch установлено равным true, тогда я могу вернуться во вход и все работает как ожидалось.
Есть идеи? Заранее спасибо!
Ответы
Ответ 1
+ Изменить
<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">
Вы также можете соединить их так для условного AND check:
<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">
Попробуйте один за другим, чтобы узнать, какой из них соответствует вашему делу.
Ответ 2
В версии 1.0 версии Angular Material (т.е. <= v0.11.4) это было так: сообщение ng было показано по умолчанию.
Однако спецификация дизайна материала гласит:
Отображать текст ошибки только после взаимодействия пользователя с полем. Если пользователь вводит неверные данные, вспомогательный текст может преобразовываться в текст ошибки.
Если вы хотите показывать сообщения перед взаимодействием с пользователем, вы можете добавить "md-auto-hide =" false "в свою директиву ng-messages.
<div ng-messages="primaryLogin.$error" md-auto-hide='false'></div>
Я нашел это решение: здесь
Ответ 3
Проверьте с помощью ng-show="primaryLogin.login.$invalid && primaryLogin.login.$touched"
. Это помогло мне.
Ответ 4
Используйте md-is-error exampl:
<md-input-container md-is-error="true">
"Когда данное выражение оценивается как true, входной контейнер переходит в состояние ошибки. По умолчанию происходит ошибка, если вход был затронут и недействителен".
https://material.angularjs.org/1.1.3/api/directive/mdInputContainer