Содержание

валидация

Состояние модели

Применение директивы ngModel не только устанавливает привязку данных, но и позволяет отслеживать состояние элемента ввода. Для установки состояния Angular применяет к элементам ввода специальные классы CSS:

Например, при запуске веб-страницы для элемента ввода:

<input class="form-control" name="title" [(ngModel)]="title" />

Будет генерироваться следующая разметка html:

<input class="form-control ng-untouched ng-pristine ng-valid" name="title" ng-reflect-name="title" />

Валидация

Перед тем как отправить форму, нам надо удостовериться, что данная форма содержит корректные значения. Для проверки используется механизм валидации. В Angular 2 мы можем использовать валидацию HTML5, которая применяется в виде атрибутов:

Для использования валидации определим следующий компонент:

import {Component, ViewChild} from '@angular/core';
import {NgForm} from "@angular/forms";
 
@Component({
  selector: 'app-root',
  template: `
    <div class="col-xs-8 col-xs-offset-2">
      <form (ngSubmit)="submitForm(myForm)" #myForm="ngForm">
        <div class="form-group" [ngClass]="{'has-error': email.invalid && email.touched}">
          <label>Email</label>
          <input email required ngModel name="email" type="text" #email="ngModel" class="form-control">
          <p class="help-block" *ngIf="email.invalid && email.touched">Введите корректный email</p>
        </div>
        <div class="form-group" [ngClass]="{'has-error': pass.invalid && pass.touched}">
          <label>Пароль</label>
          <input required ngModel #pass="ngModel" name="pass" type="password" class="form-control">
          <p class="help-block" *ngIf="pass.invalid && pass.touched">поле пароль не должно быть пустым</p>
        </div>
        <div class="form-group">
          <label>Выберите страну</label>
          <select required [ngModel]="defaultCountry" name="country" class="form-control">
            <option value="ru">Россия</option>
            <option value="by">Белоруссия</option>
            <option value="ua">Украина</option>
          </select>
        </div>
        <div class="radio" *ngFor="let ans of answers">
          <label>
            <input required [ngModel]="defaultAnswer" name="answer" type="radio" [value]="ans.type"> {{ans.text}}
          </label>
        </div>
        <button [disabled]="!myForm.valid" class="btn btn-success" type="submit">Сохранить</button>
      </form>
    </div>
  `
})
export class AppComponent {
  answers = [{
    type: 'yes',
    text: 'Да'
  }, {
    type: 'no',
    text: 'Нет'
  }];
 
  defaultAnswer = 'no';
  defaultCountry = 'ru';
 
  submitForm(form:NgForm){
    console.log('submit', form);
  }
}

Здесь проверяется валидность поля email. Для этого мы берем переменную email, которая представляет связанный с полем ввода объект NgModel (#email=«ngModel»), и смотрим на свойства valid и untouched у этого объекта. Если хотя бы одно из этих свойств равно true, email.invalid && email.touched мы видим сообщение об ошибке.

В принципе для проверки корректности нам достаточно посмотреть на свойство valid. Однако не всегда может желательно сразу отображать ошибку при загрузке страницы. В данном же случае мы смотрим на валидность, если поле ввода уже получало фокус.

Для стилизации сообщений об ошибках применяются классы bootstrap:

В то же время несмотря на наличие ошибок валидации мы можем нажать на кнопку и выполнить метод submitForm(), который обработает введенные данные. Однако поскольку данные некорректны, любая обработка будет бессмысленной. И в этом случае можно отключить кнопку. Для этого опять же можно применить проверку на валидность полей. Так, изменим код кнопки следующим образом:

<button [disabled]="!myForm.valid" class="btn btn-success" type="submit">Сохранить</button>

С помощью выражения [disabled]=«myForm.valid» для атрибута disabled устанавливается значение true, то есть кнопка отключается, если хотя бы одно из полей не валидно.