Cómo utilizar la validación de formularios personalizados en Angular
Introducción
Los validadores se utilizan para garantizar que los valores de un formulario cumplan con determinados requisitos. Están disponibles para formularios basados en plantillas o formularios reactivos en aplicaciones Angular.
Hay varios validadores integrados como required
, email
, pattern
y minLength
. También es posible desarrollar validadores personalizados para abordar funciones que no se gestionan con un validador integrado.
Por ejemplo, un validador de números de teléfono constaría de un campo de entrada y no se considerará válido a menos que el valor tenga diez dígitos.
Aquí hay una captura de pantalla de un campo de entrada de número de teléfono que proporciona un número no válido de nueve dígitos:
Y aquí hay una captura de pantalla de un campo de entrada de número de teléfono que proporciona un número válido de diez dígitos:
En este tutorial, construirá un validador personalizado para un campo de entrada de número de teléfono en una aplicación Angular.
Prerrequisitos
Para completar este tutorial, necesitarás:
- Node.js instalado localmente, lo cual puedes hacer siguiendo Cómo instalar Node.js y crear un entorno de desarrollo local .
- Algunos conocimientos sobre la configuración de un proyecto Angular .
Este tutorial fue verificado con Node v15.2.1, npm
v6.14.8, @angular/core
v11.0.0 y @angular/forms
v11.0.0.
Configuración del proyecto
Para el propósito de este tutorial, construirás a partir de un proyecto Angular predeterminado generado con @angular/cli
.
- npx @angular/cli new angular-custom-validation-example --style=css --routing=false --skip-tests
Nota: Alternativamente, puedes instalar globalmente @angular/cli
.
Esto configurará un nuevo proyecto Angular con estilos establecidos en “CSS” (a diferencia de “Sass”, Less” o “Stylus”), sin enrutamiento y sin omitir pruebas.
Navegue hasta el directorio del proyecto recién creado:
- cd angular-custom-validation-example
En este punto, tendrás un nuevo proyecto Angular.
Uso del validador en un formulario basado en plantillas
Las directivas se utilizan para la validación en formularios basados en plantillas. En este ejemplo, creará una phone-number-validator
directiva con @angular/cli
.
Primero, abra su terminal y use el @angular/cli
paquete que se instaló como dependencia de desarrollo para generar una nueva directiva:
- ./node_modules/@angular/cli/bin/ng generate directive phone-number-validator
Esto creará phone-number-validator.directive.ts
y phone-number-validator.directive.spec.ts
. También se agregará PhoneNumberValidatorDirective
a app.module.ts
.
A continuación, ábrelo phone-number-validator.directive.ts
en tu editor de código. Agrega Validator
, AbstractControl
, y NG_VALIDATORS
:
src/app/validador-de-numeros-telefonicos.directive.ts
import { Directive } from '@angular/core';import { AbstractControl, Validator, NG_VALIDATORS } from '@angular/forms';@Directive({ selector: '[appPhoneNumberValidator]', providers: [{ provide: NG_VALIDATORS, useExisting: PhoneNumberValidatorDirective, multi: true }]})export class PhoneNumberValidatorDirective implements Validator { validate(control: AbstractControl) : {[key: string]: any} | null { if (control.value control.value.length != 10) { return { 'phoneNumberInvalid': true }; } return null; }}
Este código crea una directiva que implementa Validator
of @angular/forms
. Necesitará el siguiente método de implementación: validate(control: AbstractControl): : {[key: string]: any} | null
. Este validador devolverá un objeto – { 'phoneNumberInvalid': true }
– si el valor no cumple la condición de no ser igual a una longitud de diez caracteres. De lo contrario, si el valor cumple la condición, devolverá null
.
A continuación, abra su terminal y use el @angular/cli
paquete que se instaló como dependencia de desarrollo para generar una nueva directiva:
- ./node_modules/@angular/cli/bin/ng generate component template-driven-form-example --flat
Este comando creará template-driven-form-example.component.ts
y template-driven-form-example.component.html
agregará archivos TemplateDrivenFormExampleComponent
a app.module.ts
.
A continuación, abra template-driven-form-example.component.ts
su editor de código y agregue phone
un valor inicial de una cadena vacía:
src/app/formulario-controlado-por-plantilla-ejemplo.componente.ts
import { Component } from '@angular/core';@Component({ selector: 'app-template-driven-form-example', templateUrl: './template-driven-form-example.component.html', styleUrls: ['./template-driven-form-example.component.css']})export class TemplateDrivenFormExampleComponent { phone = '';}
Angular agrega el valor de retorno de la función de validación en la errors
propiedad de FormControl
/ NgModel
. Si la errors
propiedad de FormControl
/ NgModel
no está vacía, el formulario no es válido. Si la errors
propiedad está vacía, el formulario es válido.
Para utilizar la directiva en un formulario basado en plantillas, abra template-driven-form-example.component.html
y agregue el siguiente código:
src/app/formulario-controlado-por-plantilla-ejemplo.componente.html
div labelPhone input type="text" name="phone" [(ngModel)]="phone" #phoneNgModel="ngModel" appPhoneNumberValidator [class.is-invalid]="(phoneNgModel.touched || phoneNgModel.dirty) phoneNgModel.errors?.phoneNumberInvalid" /label span *ngIf="(phoneNgModel.touched || phoneNgModel.dirty) phoneNgModel.errors?.phoneNumberInvalid" Phone number must be 10 digits /span/div
Este código crea un input
elemento y span
con un mensaje de error. El input
elemento utiliza ngModel
y el appPhoneNumberValidator
selector para la directiva.
Si se input
ha ejecutado touched
o dirty
no se aprueba la validación, ocurrirán dos cosas. En primer lugar, is-invalid
se aplicará la clase a input
. En segundo lugar, span
se mostrará el mensaje de error.
Nota: Algunas de las clases que aparecen aquí – form-group
, form-control
, invalid-feedback
y is-valid
– son parte del marco Bootstrap. No son necesarias para completar este tutorial, pero pueden aportar estética visual al formulario.
Luego, ábrelo app.module.ts
en tu editor de código y agrega FormModule
:
src/app/app.module.ts
import { BrowserModule } from '@angular/platform-browser';import { NgModule } from '@angular/core';import { FormsModule } from '@angular/forms';import { AppComponent } from './app.component';import { PhoneNumberValidatorDirective } from './phone-number-validator.directive';import { TemplateDrivenFormExampleComponent } from './template-driven-form-example.component';@NgModule({ declarations: [ AppComponent PhoneNumberValidatorDirective, TemplateDrivenFormExampleComponent ], imports: [ BrowserModule, FormsModule ], providers: [], bootstrap: [AppComponent]})export class AppModule { }
Por último, abre app.component.html
y reemplaza el contenido con tu TemplateDrivenFormExample
:
src/aplicación/aplicación.componente.html
app-template-driven-form-example/app-template-driven-form-example
Puede ejecutar el npm start
comando e interactuar con su entrada en un navegador web. Si ingresa menos de 10 caracteres o más en el campo del teléfono, aparecerá un mensaje de error.
En este punto, tienes un validador personalizado que utiliza una directiva en un formato basado en plantillas.
Uso del validador en formularios reactivos
En lugar de directivas, los formularios reactivos utilizan funciones para la validación.
Primero, abra su terminal y use el @angular/cli
paquete que se instaló como dependencia de desarrollo para generar una nueva directiva:
- ./node_modules/@angular/cli/bin/ng generate component reactive-form-example --flat
Este comando creará reactive-form-example.component.ts
y reactive-form-example.component.html
agregará archivos ReactiveFormExampleComponent
a app.module.ts
.
A continuación, abra reactive-form-example.component.ts
su editor de código y agregue FormBuilder
y AbstractControl
:
src/app/formulario-reactivo-ejemplo.componente.ts
import { Component, OnInit } from "@angular/core";import { AbstractControl, FormBuilder, FormGroup } from '@angular/forms';@Component({ selector: 'app-reactive-form-example', templateUrl: './reactive-form-example.component.html', styleUrls: ['./reactive-form-example.component.css']})export class ReactiveFormExampleComponent implements OnInit { myForm: FormGroup; constructor(private fb: FormBuilder) {} ngOnInit(): void { this.myForm = this.fb.group({ phone: ['', [ValidatePhone]] }); } saveForm(form: FormGroup) { console.log('Valid?', form.valid); // true or false console.log('Phone Number', form.value.phone); }}function ValidatePhone(control: AbstractControl): {[key: string]: any} | null { if (control.value control.value.length != 10) { return { 'phoneNumberInvalid': true }; } return null;}
Este código crea una ValidatePhone
función y la agrega a la matriz de validadores de FormControl
.
Abra reactive-form-example.component.html
su editor de código y cree el siguiente formulario:
src/app/ejemplo-de-formulario-reactivo.componente.html
form novalidate [formGroup]="myForm" (ngSubmit)="saveForm(myForm)" div div label Phone input type="text" formControlName="phone" [class.is-invalid]="(myForm.get('phone').touched || myForm.get('phone').dirty) myForm.get('phone').invalid" /label span *ngIf="(myForm.get('phone').touched || myForm.get('phone').dirty) myForm.get('phone').invalid" Phone number must be 10 digits /span /div /div /form
A diferencia del formulario basado en plantillas, este formulario incluye form
y utiliza [formGroup]
, (ngSubmit)
, formControlName
y get
.
Luego, ábrelo app.module.ts
en tu editor de código y agrega ReactiveFormsModule
:
src/app/app.module.ts
import { BrowserModule } from '@angular/platform-browser';import { NgModule } from '@angular/core';import { FormsModule, ReactiveFormsModule } from '@angular/forms';import { AppComponent } from './app.component';import { PhoneNumberValidatorDirective } from './phone-number-validator.directive';import { ReactiveFormExampleComponent } from './reactive-form-example.component';import { TemplateDrivenFormExampleComponent } from './template-driven-form-example.component';@NgModule({ declarations: [ AppComponent, PhoneNumberValidatorDirective, ReactiveFormExampleComponent, TemplateDrivenFormExampleComponent ], imports: [ BrowserModule, FormsModule, ReactiveFormsModule ], providers: [], bootstrap: [AppComponent]})export class AppModule { }
Por último, abre app.component.html
y reemplaza el contenido con tu ReactiveFormExample
:
src/aplicación/aplicación.componente.html
app-reactive-form-example/app-reactive-form-example
Puede ejecutar el npm start
comando e interactuar con su entrada en un navegador web. Si ingresa menos de 10 caracteres o más en el campo del teléfono, aparecerá un mensaje de error.
En este punto, tienes un validador personalizado que utiliza una función en forma reactiva.
Conclusión
En este artículo, se le presentó cómo agregar validación personalizada para formularios basados en plantillas y formularios reactivos en una aplicación Angular.
La validación personalizada le permite garantizar que los valores proporcionados por los usuarios se ajusten a sus expectativas.
Para una comprensión más profunda de los conceptos de esta publicación, visite esta publicación enProviders
y lea sobreAbstractControl
.
Deja una respuesta