Cristian Alejandro Ortiz Solano
como puedo resetear un formulario y que las velicaciones también se receten? :(
Ángel David Roque Ayala
this.form.reset();
¿Cómo crear validaciones grupales en Angular?
Aprender a manejar validaciones personalizadas en Angular es una habilidad poderosa. Pero, ¿qué sucede cuando necesitas validar dos o más campos en conjunto, en lugar de de manera individual? Las validaciones grupales son útiles para verificar que varios campos sigan la misma lógica o requisitos. Un ejemplo clásico es la validación de que dos contraseñas coincidan en un formulario de registro. En este artículo, vamos a explorar cómo implementar estas validaciones.
¿Qué es una validación grupal?
Una validación grupal implica comprobar el estado o valor de múltiples campos al mismo tiempo. Imagina un formulario con un campo de contraseña y otro de confirmación de contraseña. No basta con validar cada uno por separado; debemos garantizar que ambos coincidan para poder proceder con el registro del usuario.
¿Cómo implementar una validación grupal?
Para implementar una validación grupal en Angular, primero debemos asegurar que el campo de confirmación de contraseña esté correctamente vinculado a nuestro formulario reactivo. A continuación te mostramos cómo hacerlo paso a paso:
import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms'; export class MyValidators { static matchPasswords(control: AbstractControl): ValidationErrors | null { const password = control.get('password')?.value; const confirmPassword = control.get('confirmPassword')?.value; if (password !== confirmPassword) { return { matchPasswords: true }; } return null; } }
Ligado al formulario: Asegúrate de que el campo confirmPassword esté vinculado correctamente en el HTML utilizando un formControlName.
Método estático de validación: Implementa un método estático matchPasswords en una clase de validadores personalizados.
Validación con lógica: Dentro del método, toma los valores de ambos campos y verifica si son iguales. Si lo son, retorna null indicando que no hay error; si no, retorna un objeto de error.
¿Cómo mostrar los errores de validación?
Mostremos un mensaje de error si las contraseñas no coinciden. Esto se puede lograr con lógica condicional en el front-end:
<div *ngIf="form.errors?.matchPasswords && confirmPassword.touched"> <p>Las contraseñas no coinciden.</p> </div>
Esta sección del código HTML verifica si el formulario en general contiene un error de tipo matchPasswords y si el campo de confirmación está tocado, para así mostrar el mensaje de error.
¿Cuál es el desafío adicional?
Como ejercicio práctico, intenta crear dos campos que validen un rango numérico. Supongamos que quieres que estos inputs estén dentro del rango de cero a cien. Si se sale de este rango, el formulario debería mostrar un error grupal indicando que está fuera del rango esperado.
Implementar estos pasos no solo hará que tu aplicación sea más robusta, sino que aumentará tu competencia en el desarrollo de formularios complejos. Tus habilidades para manejar validaciones en Angular se beneficiarán enormemente al agregar esta herramienta a tu arsenal. ¡Sigue adelante y sigue explorando!
Cuando solo queremos obtener el valor de un campo en un grupo en los formularios reactivos podemos realizarlo de la siguiente forma aparte de la que muestra el maestro en el video.
const password = control.value.password; const confirmPassword = control.value.confirmPassword;
Cabe destacar que al obtener el valor de esta forma perdemos el acceso a las demas cualidades que poseen los form control. Este forma es buena cuando solo queremos el valor.
Cristian Alejandro Ortiz Solano
como puedo resetear un formulario y que las velicaciones también se receten? :(
Ángel David Roque Ayala
this.form.reset();
Matias Romero
En las validaciones grupales como se maneja el tema de de la validaciones de css, ya que los eventos de error por ejemplo depende de todo el formulario y no del campo, y esto activa la clase antes de tiempo.
Daniel Ramírez Castaño
<mat-form-field> <mat-label>Confirm Password:</mat-label> <input matInput formControlName="confirmPassword" type="password" [errorStateMatcher]="errorMatcher"> <mat-error *ngIf="confirmPassword().hasError('required')">Campo requerido</mat-error> <mat-error *ngIf="form.hasError('passwordsDoNotMatch')">Pass no coincide</mat-error> </mat-form-field>
class CrossFieldErrorMatcher implements ErrorStateMatcher { isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean { return control.parent.get('confirmPassword').invalid && control.touched || control.parent.hasError('passwordsDoNotMatch') && control.touched; } }
Juan Luis Oropeza
static matchPasswords(control: AbstractControl) { const passwordControl = control.get('password'); const confirmPasswordControl = control.get('confirmPassword'); if (passwordControl && confirmPasswordControl) { const password = passwordControl.value; const confirmPassword = confirmPasswordControl.value; if (password !== confirmPassword) { return { match_password: true }; } } return null; }
Asi me quedo a mi, no me dejaba setear directamente el value del control por que podia ser null
Rahiber Paradas
Dejo mi aporte, hice la validación de modo que pueda ser usado con cualquier campo y en cualquier formulario pasando como parámetro los campos a validar.
Validador:
Componente:
Félix Alejandro Zelaya Orellana
Muy interesante! No lo había aplicado nunca, muchas gracias!