Как создать собственный валидатор для реактивных форм в Angular
Введение
Пакет @angular/forms
Angular поставляется с классом Validators
, который поддерживает полезные встроенные средства проверки, такие как required
, minLength
, maxLength
и шаблон
. Однако могут быть поля формы, для проверки которых требуются более сложные или настраиваемые правила. В таких ситуациях вы можете использовать собственный валидатор.
При использовании реактивных форм в Angular вы определяете собственные валидаторы с функциями. Если валидатор не нуждается в повторном использовании, он может существовать как функция непосредственно в файле компонента. В противном случае, если валидатор нужно повторно использовать в других компонентах, он может существовать в отдельном файле.
В этом руководстве вы создадите реактивную форму с многоразовым пользовательским валидатором, чтобы проверить, соответствует ли URL-адрес определенным условиям.
Предпосылки
Для выполнения этого урока вам понадобятся:
- Node.js установлен локально, что можно сделать, следуя инструкциям по установке Node.js и созданию локальной среды разработки.
- Некоторое знакомство с настройкой проекта Angular.
Это руководство было проверено с помощью Node v15.2.1, npm
v6.14.8, @angular/core
v11.0.0 и @angular/forms
v11. .0.0.
Шаг 1 – Настройка проекта
Для целей этого руководства вы создадите проект Angular по умолчанию, сгенерированный с помощью @angular/cli
.
- npx @angular/cli new angular-reactive-forms-custom-validtor-example --style=css --routing=false --skip-tests
Это настроит новый проект Angular со стилями, установленными на «CSS» (в отличие от «Sass», «Less» или «Stylus»), без маршрутизации и пропуска тестов.
Перейдите в только что созданный каталог проекта:
- cd angular-reactive-forms-custom-validator-example
Для работы с реактивными формами вы будете использовать ReactiveFormsModule
вместо FormsModule
.
Откройте app.module.ts
в редакторе кода и добавьте ReactiveFormsModule
:
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { ReactiveFormsModule } from '@angular/forms';
import { AppComponent } from './app.component';
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
ReactiveFormsModule,
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
На этом этапе у вас должен быть новый проект Angular с ReactiveFormsModule
.
Шаг 2 — Создание пользовательского валидатора
Пример пользовательского валидатора для этого руководства будет принимать строку URL и гарантировать, что она начинается с протокола https
и заканчивается доменом верхнего уровня .io
.
Сначала в терминале создайте каталог shared
:
- mkdir src/shared
Затем в этом новом каталоге создайте новый файл url.validator.ts
. Откройте этот файл в редакторе кода и добавьте следующие строки кода:
import { AbstractControl } from '@angular/forms';
export function ValidateUrl(control: AbstractControl) {
if (!control.value.startsWith('https') || !control.value.includes('.io')) {
return { invalidUrl: true };
}
return null;
}
В этом коде используется класс Notice AbstractControl
, который является базовым классом для FormControl
, FormGroup
и FormArray
. с. Это позволяет получить доступ к значению FormControl
.
Этот код проверит, соответствует ли значение startsWith
строке символов для https
. Он также проверит, содержит ли значение включает
строку символов для .io
.
Если проверка не пройдена, возвращается объект с ключом для имени ошибки, invalidUrl
и значением true
.
В противном случае, если проверка пройдет успешно, будет возвращен null
.
На этом этапе ваш пользовательский валидатор готов к использованию.
Шаг 3 — Использование пользовательского валидатора
Затем создайте форму, которая принимает userName
и websiteUrl
.
Откройте app.component.ts
и замените содержимое следующими строками кода:
import { Component, OnInit } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { ValidateUrl } from '../shared/url.validator';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
myForm: FormGroup;
constructor(private fb: FormBuilder) {}
ngOnInit() {
this.myForm = this.fb.group({
userName: ['', Validators.required],
websiteUrl: ['', [Validators.required, ValidateUrl]]
});
}
saveForm(form: FormGroup) {
console.log('Valid?', form.valid); // true or false
console.log('Username', form.value.userName);
console.log('Website URL', form.value.websiteUrl);
}
}
В этом коде элемент управления формой websiteUrl
использует как встроенный валидатор Validators.required
, так и пользовательский валидатор ValidateUrl
.
Шаг 4 – Доступ к ошибкам в шаблоне
Пользователям, взаимодействующим с вашей формой, потребуется обратная связь о том, какие значения не проходят проверку. В шаблоне компонента вы можете использовать ключ, который вы определили в возвращаемом значении пользовательского валидатора.
Откройте app.component.html
и замените содержимое следующими строками кода:
<form [formGroup]="myForm" ngSubmit)="saveForm(myForm)">
<div>
<label>
Username:
<input formControlName="userName" placeholder="Your username">
</label>
<div *ngIf="(
myForm.get('userName').dirty ||
myForm.get('userName').touched
) &&
myForm.get('userName').invalid"
>
Please provide your username.
</div>
</div>
<div>
<label>
Website URL:
<input formControlName="websiteUrl" placeholder="Your website">
</label>
<div
*ngIf="(
myForm.get('websiteUrl').dirty ||
myForm.get('websiteUrl').touched
) &&
myForm.get('websiteUrl').invalid"
>
Only URLs served over HTTPS and from the .io top-level domain are accepted.
</div>
</div>
</form>
На этом этапе вы можете скомпилировать ваше приложение:
- npm start
И откройте его в своем веб-браузере. Вы можете взаимодействовать с полями для userName
и websiteUrl
. Убедитесь, что ваш пользовательский валидатор для ValidateUrl
работает должным образом со значением, которое должно удовлетворять условиям https
и .io
: https: //пример.io
.
Заключение
В этой статье вы создали многоразовый настраиваемый валидатор для реактивной формы в приложении Angular.
Примеры пользовательских валидаторов в формах на основе шаблонов и реактивных формах см. в разделе Проверка пользовательских форм в Angular.
Если вы хотите узнать больше об Angular, ознакомьтесь с нашей темой по Angular, где вы найдете упражнения и проекты по программированию.