Статьи

Простая проверка формы в AngularJS с помощью ngMessages

Осенью прошлого года модуль ngMessages был выпущен с выпуском Angular 1.3. Это добавило расширенную поддержку для отображения сообщений пользователю — как правило, сообщения об ошибках от проверки формы. Перед выпуском ngMessages разработчики были вынуждены полагаться на такие директивы, как ng-class и ng-show для отображения этих ошибок. Это привело к загроможденному, повторяющемуся коду.

Однако теперь ngMessages предоставляет возможность отображать пользовательские сообщения об ошибках, не нарушая принцип кодирования DRY — не повторяйте себя. И, по мере того как Angular постепенно продвигается к версии 2.0, команда разработчиков Angular продолжает внедрять для нее новые функции . Поэтому я подумал, что было бы полезно продемонстрировать, насколько просто ngMessages делает процесс проверки форм в AngularJS.

Начиная

Это будет наш основной шаблон:

 <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <title>ngMessages demo</title> </head> <body ng-app="app"> <script src="path/to/angular.min.js"></script> <script src="path/to/angular-messages.min.js"></script> <script> var app = angular.module('app', ['ngMessages']); </script> </body> </html> 

Как видите, мы загружаем Angular, а ngMessages модуль ngMessages , прежде чем ngMessages его в наше приложение. Для тех из вас, кто хочет следовать дома, код этого руководства доступен на GitHub . Для нетерпеливых, вы также можете перейти к демонстрации в конце статьи.

Далее мы собираемся создать форму со следующими полями:

  1. Имя
  2. Фамилия
  3. Адрес электронной почты
  4. Телефонный номер
  5. Сообщение

Я добавлю required атрибут ко всем полям (так как они будут обязательными), а также использую директиву ng-model чтобы связать их со свойствами в текущей области.

 <form name="exampleForm" class="myForm" required> <label>First Name:</label> <input type="text" name="userFirstName" ng-model="firstName" required /> <label>Last Name:</label> <input type="text" name="userLastName" ng-model="lastName" required /> <label>Email Address:</label> <input type="email" name="userEmail" ng-model="email" required /> <label>Phone Number:</label> <input type="email" name="userPhoneNumber" ng-model="phoneNumber" required /> <label>User Message:</label> <textarea type="text" name="userMessage" ng-model="message" required></textarea> </form> 

Введите ngMessages

Теперь давайте ngMessages в код и посмотрим, как ngMessages позволяет нам использовать атрибуты, которые мы указываем для входных данных, для простой проверки формы.

Обязательные поля

Первое, на что следует обратить внимание, это то, что форма называется exampleForm . При использовании директивы ng-messages мы передаем ей угловое выражение, оценивающее объект ключ / значение (обычно это объект $error в экземпляре ngModel ). В нашем случае это будет имя формы, связанное с атрибутом имени соответствующего поля формы, связанное с вышеупомянутым объектом $error .

 <div ng-messages="exampleForm.userFirstName.$error"> 

Как только это будет сделано, вам просто нужно ngMessages div содержащий атрибут ng-message внутри ngMessages div . Значение, передаваемое атрибуту ng-message будет зависеть от директив, которые мы добавили в поле ввода; в этом случае значение будет required .

Это даст нам:

 <label>First Name:</label> <input type="text" name="userFirstName" ng-model="firstName" required /> <div ng-messages="exampleForm.userFirstName.$error"> <div ng-message="required">This field is required</div> </div> <label>Last Name:</label> <input type="text" name="userLastName" ng-model="lastName" required /> <div ng-messages="exampleForm.userLastName.$error"> <div ng-message="required">This field is required</div> </div> 

Эл. адрес

Далее мы хотим убедиться, что пользователь вводит правильный адрес электронной почты. К счастью, HTML5 делает это довольно простой задачей. В предыдущем примере атрибут name полей ввода принимал значение text , однако адреса электронной почты принимают значение email . Как и в примере выше, вы просто связываете имя формы, имя ввода и валидатор ошибок и передаете их атрибуту ng-messages , чтобы активировать сообщения об ошибках. Затем мы можем добавить дополнительный div содержащий атрибут ng-message который принимает значение email . Таким образом, мы можем настроить таргетинг на значение электронной почты точно так же, как и на required значение.

 <label>Email Address:</label> <input type="email" name="userEmail" ng-model="email" required /> <div ng-messages="exampleForm.userEmail.$error"> <div ng-message="required">This field is required</div> <div ng-message="email">Your email address is invalid</div> </div> 

Регулярные выражения

В дальнейшем мы будем использовать директиву ng-pattern для проверки номера телефона пользователя. Для тех, кто не знаком с ng-pattern , он используется, чтобы убедиться, что поле ввода соответствует регулярному выражению, которое передается в атрибут. В этом случае мы будем проверять номер телефона пользователя, передавая следующее регулярное выражение в атрибут ng-pattern :

 /^[\+]?[(]?[0-9]{3}[)]?[-\s\.]?[0-9]{3}[-\s\.]?[0-9]{4,6}$/ 

Это будет соответствовать следующим форматам (и убедитесь, что мы принимаем действительный десятизначный номер телефона):

 (123) 456-7890 123-456-7890 123.456.7890 1234567890 +31636363634 075-63546725 

Сообщение об ошибке ng-pattern активируется путем передачи значения pattern в ng-message , что можно увидеть в приведенном ниже коде:

 <label>Phone Number:</label> <input type="email" name="userPhoneNumber" ng-model="phoneNumber" ng-pattern="/^[\+]?[(]?[0-9]{3}[)]?[-\s\.]?[0-9]{3}[-\s\.]?[0-9]{4,6}$/" required/> <div ng-messages="exampleForm.userPhoneNumber.$error"> <div ng-message="required">This field is required</div> <div ng-message="pattern">Must be a valid 10 digit phone number</div> </div> 

Проверка телефонных номеров с помощью регулярных выражений — сложная задача (и, честно говоря, проще — лучше). Чтобы узнать больше об этом, вы можете прочитать эту статью SitePoint или эту ветку переполнения стека . Чтобы узнать больше о регулярных выражениях в целом, вы можете прочитать эту статью в Mozilla Developer Network.

Минимальная длина и максимальная длина

Последнее, что мы хотим сделать, это проверить сообщение пользователя. Имя этого поля — userMessage и оно обязательно, как и в приведенных выше примерах. Однако на этот раз мы будем использовать ng-minlength и ng-maxlength . Оба эти атрибута принимают целочисленные значения, которые будут равны установленному количеству символов — атрибут ng-minlength используется для задания количества символов, ограниченных пользователем, тогда как атрибут ng-maxlength устанавливает максимальное количество символов, которое пользователь разрешено войти

В приведенном ниже примере вы увидите, что мы передаем сообщения об ошибках как в значения minlength и maxlength . При этом сообщение об ошибке для значения minlength будет отображаться до тех пор, пока пользователь не minlength нужное количество символов. Кроме того, сообщение об ошибке, определенное для maxlength , появится, когда пользователь maxlength установленное количество символов, переданных в атрибут ng-maxlength .

 <label>User Message:</label> <textarea type="text" name="userMessage" ng-model="message" ng-minlength="100" ng-maxlength="1000" required> </textarea> <div ng-messages="exampleForm.userMessage.$error"> <div ng-message="required">This field is required</div> <div ng-message="minlength">Message must be over 100 characters</div> <div ng-message="maxlength">Message must not exceed 1000 characters</div> </div> 

Теперь, когда мы проверили все необходимые поля, у вас должна быть полностью функциональная форма, которая отображает любое сообщение, которое вы пожелаете, основываясь на тегах ввода для вашей формы!

Последний твик

Одна из лучших особенностей ngMessages и Angular в целом — это возможность совместно использовать различные директивы. Например, вы можете скрыть сообщения об ошибках, добавив оператор ng-if="exampleForm.inputName.$dirty после директивы ng-messages . Чтобы показать вам, как это делается, я добавил оператор ng-if в userMessage раздел формы, который мы только что создали. Теперь нет сообщений об ошибках до тех пор, пока поле не будет затронуто или загрязнено.

 <label>User Message:</label> <textarea type="text" name="userMessage" ng-model="message" ng-minlength="100" ng-maxlength="1000" required> </textarea> <div ng-messages="exampleForm.userMessage.$error" ng-if="exampleForm.userMessage.$dirty"> <div ng-message="required">This field is required</div> <div ng-message="minlength">Message must be over 100 characters</div> <div ng-message="maxlength">Message must not exceed 1000 characters</div> </div> 

Вывод

Надеемся, что к настоящему времени вы уже достаточно ngMessages API ngMessages и в том, как его можно использовать для простой проверки формы. В дополнение к тому, что мы видели здесь, есть множество других трюков, которые вы можете сделать. Например, Angular позволяет вам связывать вместе директивы ngMessages и ngAnimate и создавать собственные анимации, которые показывают и скрывают пользовательские сообщения об ошибках. Я призываю вас использовать эту новую функцию в Angular и чувствовать себя максимально комфортно с ней — модуль ngMessages предлагает множество различных функций при работе с данными форм, от которых вы наверняка не хотите отказываться!

Если у вас есть какие-либо вопросы или вы хотите поделиться своим мнением об этой технике, не стесняйтесь обращаться ко мне в комментариях.