Cómo utilizar la validación de formularios personalizados en Angular

Introducción

Índice
  1. Introducción
  • Prerrequisitos
  • Configuración del proyecto
  • Uso del validador en un formulario basado en plantillas
  • Uso del validador en formularios reactivos
  • Conclusió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, patterny 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, npmv6.14.8, @angular/corev11.0.0 y @angular/formsv11.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.

    1. 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:

    1. 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-validatordirectiva con @angular/cli.

    Primero, abra su terminal y use el @angular/clipaquete que se instaló como dependencia de desarrollo para generar una nueva directiva:

    1. ./node_modules/@angular/cli/bin/ng generate directive phone-number-validator

    Esto creará phone-number-validator.directive.tsy phone-number-validator.directive.spec.ts. También se agregará PhoneNumberValidatorDirectivea app.module.ts.

    A continuación, ábrelo phone-number-validator.directive.tsen 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 Validatorof @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/clipaquete que se instaló como dependencia de desarrollo para generar una nueva directiva:

    1. ./node_modules/@angular/cli/bin/ng generate component template-driven-form-example --flat

    Este comando creará template-driven-form-example.component.tsy template-driven-form-example.component.htmlagregará archivos TemplateDrivenFormExampleComponenta app.module.ts.

    A continuación, abra template-driven-form-example.component.tssu editor de código y agregue phoneun 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 errorspropiedad de FormControl/ NgModel. Si la errorspropiedad de FormControl/ NgModelno está vacía, el formulario no es válido. Si la errorspropiedad está vacía, el formulario es válido.

    Para utilizar la directiva en un formulario basado en plantillas, abra template-driven-form-example.component.htmly 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 inputelemento y spancon un mensaje de error. El inputelemento utiliza ngModely el appPhoneNumberValidatorselector para la directiva.

    Si se inputha ejecutado touchedo dirtyno se aprueba la validación, ocurrirán dos cosas. En primer lugar, is-invalidse aplicará la clase a input. En segundo lugar, spanse mostrará el mensaje de error.

    Nota: Algunas de las clases que aparecen aquí – form-group, form-control, invalid-feedbacky 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.tsen 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.htmly 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 startcomando 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/clipaquete que se instaló como dependencia de desarrollo para generar una nueva directiva:

    1. ./node_modules/@angular/cli/bin/ng generate component reactive-form-example --flat

    Este comando creará reactive-form-example.component.tsy reactive-form-example.component.htmlagregará archivos ReactiveFormExampleComponenta app.module.ts.

    A continuación, abra reactive-form-example.component.tssu editor de código y agregue FormBuildery 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 ValidatePhonefunción y la agrega a la matriz de validadores de FormControl.

    Abra reactive-form-example.component.htmlsu 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 formy utiliza [formGroup], (ngSubmit), formControlNamey get.

    Luego, ábrelo app.module.tsen 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.htmly 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 startcomando 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 .

    SUSCRÍBETE A NUESTRO BOLETÍN 
    No te pierdas de nuestro contenido ni de ninguna de nuestras guías para que puedas avanzar en los juegos que más te gustan.

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

    Subir

    Este sitio web utiliza cookies para mejorar tu experiencia mientras navegas por él. Este sitio web utiliza cookies para mejorar tu experiencia de usuario. Al continuar navegando, aceptas su uso. Mas informacion