Cómo utilizar formularios reactivos en Angular
Introducción
Angular ofrece dos formas de trabajar con formularios: formularios basados en plantillas y formularios reactivos (también conocidos como formularios basados en modelos ). Los formularios basados en plantillas son la forma predeterminada de trabajar con formularios en Angular. Con los formularios basados en plantillas, se utilizan directivas de plantilla para crear una representación interna del formulario. Con los formularios reactivos, creas tu propia representación de un formulario en la clase del componente.
Nota: Las formas reactivas se introdujeron con Angular 2.
Estas son algunas de las ventajas de las formas reactivas:
- Uso de validadores personalizados
- Cambiar la validación dinámicamente
- Adición dinámica de campos de formulario
En este artículo, explorará cómo se pueden aplicar formularios reactivos a una aplicación Angular de ejemplo.
Prerrequisitos
Si deseas seguir este artículo, necesitarás:
- Node.js instalado localmente, lo cual puedes hacer siguiendo Cómo instalar Node.js y crear un entorno de desarrollo local .
Esta publicación asume que tienes algunos conocimientos básicos de Angular.
Esta publicación también asume que estás creando a partir de un proyecto Angular nuevo generado por @angular/cli
. Puedes consultar esta publicación si estás comenzando a usar Angular CLI.
Este tutorial fue verificado con Node v15.1.0, npm
v6.14.8, @angular/core
v11.0.0 y @angular/forms
v11.0.0.
Paso 1: 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-reactive-forms-example --style=css --routing=false --skip-tests
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-reactive-forms-example
Para trabajar con formularios reactivos, utilizarás ReactiveFormsModule
en lugar de FormsModule
.
Á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 { ReactiveFormsModule } from '@angular/forms';import { AppComponent } from './app.component';@NgModule({ declarations: [ AppComponent ], imports: [ BrowserModule, ReactiveFormsModule, ], providers: [], bootstrap: [AppComponent]})export class AppModule { }
En este punto, deberías tener un nuevo proyecto Angular con ReactiveFormsModule
.
Paso 2: Agregar un formulario a la plantilla del componente
Con formas reactivas, la lógica se declara completamente en la clase del componente.
Ábrelo app.component.html
en tu editor de código y agrega las siguientes líneas de código:
src/aplicación/aplicación.componente.html
form [formGroup]="myForm" (ngSubmit)="onSubmit(myForm)" div label Name: input formControlName="name" placeholder="Your name" /label /div div label Email: input formControlName="email" placeholder="Your email" /label /div div label Message: input formControlName="message" placeholder="Your message" /label /div button type="submit"Send/button/form
Este código creará un formulario con tres campos: name
, email
, y message
. También habrá un "submit"
botón con la etiqueta "Send"
. Al enviar el formulario, onSubmit(myForm)
se llamará al método.
Nota: si utiliza Angular 2.x, también debe agregar la novalidate
directiva con la form
etiqueta de apertura, ya que Angular anula la validación de HTML5. Con Angular 4+, novalidate
se agrega automáticamente en segundo plano.
Vamos a desglosarlo:
formGroup
:El formulario será tratado como unaFormGroup
clase en el componente, por lo que laformGroup
directiva permite dar un nombre al grupo de formularios.ngSubmit
:Este es el evento que se activará al enviar el formulario.formControlName
:Cada campo de formulario debe tener unaformControlName
directiva con un valor que será el nombre utilizado en la clase del componente.
En este punto, deberías tener un nuevo proyecto Angular con una plantilla de componente que usa un formulario.
Paso 3: creación de la clase de componente
A continuación, en la clase de componente, definirá los s FormGroup
individuales y FormControl
dentro del FormGroup
.
Si se proporciona un valor al crear un FormControl
, se utilizará como valor inicial para el campo.
Observe cómo los nombres FormGroup
y FormControl
son los mismos que se usaron en la plantilla. Observe también cómo inicializa FormGroup
en el ngOnInit
gancho de ciclo de vida :
src/app/app.component.ts
import { Component, OnInit } from '@angular/core';import { FormControl, FormGroup } from '@angular/forms';@Component({ selector: 'app-root', templateUrl: './app.component.html', styleUrls: ['./app.component.css']})export class AppComponent implements OnInit { myForm: FormGroup; ngOnInit() { this.myForm = new FormGroup({ name: new FormControl('Sammy'), email: new FormControl(''), message: new FormControl('') }); } onSubmit(form: FormGroup) { console.log('Valid?', form.valid); // true or false console.log('Name', form.value.name); console.log('Email', form.value.email); console.log('Message', form.value.message); }}
A los efectos de este tutorial, el onSubmit
método no comunica los valores del formulario enviado a ningún servicio o servidor externo. Sirve para mostrar cómo se puede acceder a la validez y FormControl
los valores del formulario.
En este punto, puede compilar su aplicación y abrirla en un navegador web. Después de ingresar los valores para name
, email
, y message
y presionar Enviar , el registro de la consola mostrará los valores.
Paso 4: Actualización de la clase de componente a utilizarFormBuilder
La ngOnInit
construcción del formulario se puede reescribir con el FormBuilder
asistente. Esto le permite prescindir de todos los cambios en los grupos de formularios y controles de formularios.
Vuelva app.component.ts
a visitar su editor de código y elimine FormControl
y reemplace FormGroup
con FormBuilder
:
src/app/app.component.ts
import { Component, OnInit } from '@angular/core';import { FormBuilder, FormGroup } from '@angular/forms';@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({ name: 'Sammy', email: '', message: '' }); } onSubmit(form: FormGroup) { console.log('Valid?', form.valid); // true or false console.log('Name', form.value.name); console.log('Email', form.value.email); console.log('Message', form.value.message); }}
Este código FormBuilder
reduce la cantidad de código repetitivo para crear un FormGroup
.
Paso 5: Actualización de la clase de componente a utilizarValidators
Agregue la Validators
clase a sus importaciones y declare sus controles de formulario con matrices en lugar de simples valores de cadena.
El primer valor de la matriz es el valor inicial del formulario y el segundo valor es para que lo utilicen los validadores. Observe cómo se pueden utilizar varios validadores en el mismo control de formulario al incluirlos en una matriz.
RevisaRevisa app.component.ts
en tu editor de código y agrega Validators
:
src/app/app.component.ts
import { Component, OnInit } from '@angular/core';import { FormBuilder, FormGroup, Validators } from '@angular/forms';@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({ name: ['Sammy', Validators.required], email: ['', [Validators.required, Validators.email]], message: ['', [Validators.required, Validators.minLength(15)]], }); } onSubmit(form: FormGroup) { console.log('Valid?', form.valid); // true or false console.log('Name', form.value.name); console.log('Email', form.value.email); console.log('Message', form.value.message); }}
Este código se agrega required
a los campos name
, email
y message
. También garantiza que el email
valor utilice el formato de una dirección de correo electrónico válida. También garantiza que el message
valor tenga al menos 15 caracteres.
Si no se cumple alguno de estos requisitos de formulario, el valid
valor será false
. Si se cumplen todos estos requisitos de formulario, el valid
valor será true
.
Paso 6: Acceso al valor del formulario y a la validez de la plantilla
En la plantilla, puede acceder FormControl
al valor y la validez de cada uno y al valor y la validez de todo el grupo de formularios en su conjunto.
Revise app.component.html
y use *ngIf
para mostrar mensajes de comentarios al usuario si los valores del formulario no son válidos:
src/aplicación/aplicación.componente.html
form [formGroup]="myForm" (ngSubmit)="onSubmit(myForm)" div label Name: input formControlName="name" placeholder="Your name" /label div *ngIf="myForm.get('name').invalid (myForm.get('name').dirty || myForm.get('name').touched)" Please provide a name. /div /div div label Email: input formControlName="email" placeholder="Your email" /label div *ngIf="myForm.get('email').invalid (myForm.get('email').dirty || myForm.get('email').touched)" Please provide a valid email address. /div /div div label Message: input formControlName="message" placeholder="Your message" /label div *ngIf="myForm.get('message').invalid (myForm.get('message').dirty || myForm.get('message').touched)" Messages must be at least 15 characters long. /div /div button type="submit" [disabled]="myForm.invalid"Send/button/form
Este código verifica si el usuario ha interactuado con el campo ( dirty
o touched
). Luego, si el valor no cumple con los requisitos de validación, mostrará el mensaje de error. El botón Enviar también se desactivará hasta que se resuelvan todos los problemas con los valores del formulario.
Existen varias formas de recuperar valores de control de formulario. En este ejemplo se utiliza myForm.get('name')
que es equivalente a myForm.controls.name
. Es posible recuperar información de error con .hasError('required')
o .errors.required
.
Conclusión
En este artículo, exploró cómo se pueden aplicar los formularios reactivos a una aplicación Angular de ejemplo. Usó FormControl
, FormGroup
, FormBuilder
y Validators
para construir un formulario de ejemplo con validación. Para obtener más funciones, consulte la documentación oficial .
Si desea obtener más información sobre Angular, consulte nuestra página de temas de Angular para ver ejercicios y proyectos de programación.
Deja una respuesta