У меня есть форма с полями ввода и настройки проверки путем добавления required
атрибутов и тому подобное. Но для некоторых полей мне нужно сделать дополнительную проверку. Как бы я «подключился» к проверке, которая FormController
контролирует?
Пользовательская проверка может выглядеть примерно так: «если эти 3 поля заполнены, то это поле обязательно для заполнения и должно быть отформатировано определенным образом».
Есть метод, FormController.$setValidity
но он не похож на публичный API, поэтому я не буду его использовать. Создание пользовательской директивы и ее использование NgModelController
выглядит как еще один вариант, но в основном мне потребуется создать директиву для каждого пользовательского правила проверки, что мне не нужно.
На самом деле, пометка поля из контроллера как недействительного (хотя и FormController
с синхронизацией) может быть тем, что мне нужно в простейшем сценарии для выполнения работы, но я не знаю, как это сделать.
formName.$warning
.$$
предшествует публичный apis, с$
публичностью. См. Stackoverflow.com/questions/19338493/…Ответы:
Изменить: добавлена информация о ngMessages (> = 1.3.X) ниже.
Стандартные сообщения проверки формы (1.0.X и выше)
Поскольку это один из лучших результатов, если вы пользуетесь Google «Проверка угловых форм», в настоящее время я хочу добавить еще один ответ на этот вопрос для всех, кто придет оттуда.
Это "публика", не беспокойтесь. Используй это. Вот для чего это. Если бы это не было предназначено, разработчики Angular приватизировали бы его в закрытом состоянии.
Чтобы выполнить пользовательскую проверку, если вы не хотите использовать Angular-UI, как предлагает другой ответ, вы можете просто свернуть свою собственную директиву проверки.
А вот пример использования:
Примечание: в 1.2.X это, вероятно , preferrable заменить
ng-if
наng-show
вышеВот обязательная плункерная ссылка
Кроме того, я написал несколько записей в блоге только на эту тему, которые более подробно рассматриваются:
Проверка угловых форм
Пользовательские директивы валидации
Редактировать: используя ngMessages в 1.3.X
Теперь вы можете использовать модуль ngMessages вместо ngShow для отображения ваших сообщений об ошибках. На самом деле он будет работать с чем угодно, это не должно быть сообщением об ошибке, но вот основы:
<script src="angular-messages.js"></script>
Ссылка
ngMessages
в декларации вашего модуля:Добавьте соответствующую разметку:
В приведенной выше разметке в
ng-message="personForm.email.$error"
основном указывается контекст дляng-message
дочерних директив. Затемng-message="required"
иng-message="email"
укажите свойства в этом контексте для просмотра. Самое главное, они также указывают порядок их регистрации . Первый, который он находит в списке «правдивых», побеждает, и он покажет это сообщение, и ни один из остальных.И плункер для примера ngMessages
источник
return value ? valid : undefined
выше.Проект Angular-UI включает в себя директиву ui-validate, которая, вероятно, поможет вам в этом. Это позволяет вам указать функцию для вызова, чтобы сделать проверку.
Взгляните на демонстрационную страницу: http://angular-ui.github.com/ , найдите вниз до заголовка Validate.
Со страницы демо:
тогда в вашем контроллере:
источник
Вы можете использовать ng-required для вашего сценария проверки («если эти 3 поля заполнены, то это поле обязательно»:
источник
Вы можете использовать Angular-Validator .
Пример: использование функции для проверки поля
Тогда в вашем контроллере у вас будет что-то вроде
Вы также можете сделать что-то вроде этого:
(где field1 field2 и field3 - переменные области видимости. Вы также можете проверить, не равняются ли поля пустой строке)
Если поле не проходит,
validator
то поле будет помечено как недействительное, и пользователь не сможет отправить форму.Дополнительные примеры использования и примеры см .: https://github.com/turinggroup/angular-validator.
Отказ от ответственности: я автор Angular-Validator
источник
Недавно я создал директиву, позволяющую делать недействительными основанные на выражениях вводы угловых форм. Можно использовать любое допустимое угловое выражение, и оно поддерживает пользовательские ключи проверки с использованием нотации объекта. Протестировано с угловой v1.3.8
Вы можете использовать это так:
Или просто передавая выражение (ему будет присвоен ключ validationKey по умолчанию "invalidIf")
источник
Вот крутой способ сделать пользовательские проверки шаблонных выражений в форме (из: Расширенная проверка формы с AngularJS и фильтрами ):
jsFiddle demo (поддерживает именование выражений и множественные выражения)
Это похоже на
ui-validate
, но вам не нужна специфическая для области функция проверки (это работает в общем) и, конечно, вам не нужен ui.utils таким образом.источник
Обновить:
Улучшенная и упрощенная версия предыдущей директивы (одна вместо двух) с той же функциональностью:
Пример использования:
Результат: взаимозависимые тестовые выражения, в которых валидаторы выполняются при изменении другой директивной модели и текущей модели.
Тестовое выражение имеет локальную
$model
переменную, которую следует использовать для сравнения с другими переменными.Ранее:
Я попытался улучшить код @Plantface, добавив дополнительную директиву. Эта дополнительная директива очень полезна, если наше выражение необходимо выполнить, когда изменения сделаны в более чем одной переменной ngModel.
Пример того, как использовать его для создания перекрестных проверенных полей:
ensure-expression
выполняется для проверки модели приng-model
изменении любой изensure-watch
переменных.источник
@synergetic Я думаю, что @blesh положит функцию валидации, как показано ниже
источник
Пользовательские проверки, которые вызывают сервер
Используйте API ngModelController,
$asyncValidators
который обрабатывает асинхронную проверку, например, делает$http
запрос к бэкэнду. Функции, добавленные к объекту, должны возвращать обещание, которое должно быть разрешено, если оно допустимо, или отклонено, если оно недействительно. Выполняемые асинхронные проверки сохраняются ключомngModelController.$pending
. Для получения дополнительной информации см. AngularJS Developer Guide - Forms (Custom Validation) .Для получения дополнительной информации см.
$asyncValidators
API ngModelControllerAngularJS Developer Guide - Forms (Пользовательская проверка) .
Использование
$validators
APIПринятый ответ использует
$parsers
и$formatters
трубопроводы для добавления пользовательского синхронного валидатора. AngularJS 1.3+ добавил$validators
API , так что нет необходимости ставить валидатор в$parsers
и$formatters
трубопроводах:Для получения дополнительной информации посмотрите Ссылку API AngularJS ngModelController - $ validators .
источник
В AngularJS лучшее место для определения пользовательской проверки - это директива Cutsom. AngularJS предоставляет модуль ngMessages.
Для проверки пользовательской формы следует использовать модули ngMessages с пользовательской директивой. Здесь у меня есть простая проверка, которая проверит, если длина номера меньше 6, отобразит ошибку на экране
Вот как создать пользовательскую директиву проверки
$setValidity
встроенная функция для установки состояния модели на действительное / недействительноеисточник
Я расширил ответ @Ben Lesh, указав, чувствительна ли к регистру проверка (по умолчанию)
использовать:
код:
источник
В этой ветке представлено несколько отличных примеров и библиотек, но у них не было того, что я искал. Мой подход: angular-validity - библиотека валидации на основе обещаний для асинхронной валидации с опциональным встроенным стилем Bootstrap.
Решение по угловой точности для варианта использования OP может выглядеть примерно так:
Вот скрипка , если вы хотите взять ее на спин. Библиотека доступна на GitHub , имеет подробную документацию и множество живых демонстраций.
источник