Félix Alejandro Zelaya Orellana
Genial!!
Seba Cardoso
Genial x2
¿Cómo crear validaciones personalizadas en Angular?
Crear validaciones personalizadas en Angular permite diseñar reglas específicas que no están cubiertas por las validaciones integradas. Por ejemplo, si necesitas que una contraseña contenga un número, puedes implementar tu propia lógica. Pero, ¿cómo se logra esto en Angular? Vamos a explorarlo paso a paso.
¿Qué necesitamos para empezar?
Para agregar una validación personalizada en Angular, es crucial tener un formulario previamente construido. En el ejemplo que veremos, utilizamos un formulario de registro que debe validar la presencia de al menos un número en el campo de contraseña. Además, se recomienda contar con conocimientos básicos de JavaScript y TypeScript, dado que se utilizarán funciones específicas de estos lenguajes en el proceso.
¿Cómo implementamos la lógica en JavaScript?
Se necesita comprender ciertos métodos de JavaScript para implementar la validación de manera eficaz:
split('') para separar cada caracter de la contraseña en un arreglo:
let password = 'Juanito2010'; let caracteres = password.split('');
find para verificar la existencia de al menos un número:
const contieneNumero = caracteres.find(caracter => !isNaN(parseInt(caracter)));
isNaN ayuda a identificar si un caracter es un número después de intentar convertirlo con parseInt.Creación de la validación personalizada en TypeScript
La validación personalizada se implementa como un método estático dentro de una clase de validadores, como se muestra a continuación:
import { AbstractControl, ValidationErrors } from '@angular/forms'; export class MyValidators { static validPassword(control: AbstractControl): ValidationErrors | null { const value: string = control.value || ''; // Split the string and find any numeric character const contieneNumero = value.split('').find(caracter => !isNaN(parseInt(caracter))); // Return null if the password contains a number (valid), otherwise return an error return contieneNumero ? null : { invalidPassword: true }; } }
¿Cómo integrarlo en el formulario?
Una vez que el método esté listo, se integra en el formulario de la siguiente manera:
Importar el validador en el componente:
import { MyValidators } from '[ruta-a-utils]/validators';
Incorporar al FormGroup:
this.form = this.formBuilder.group({ password: ['', [Validators.required, MyValidators.validPassword]], // otros campos... });
Visualización de errores en el template: Utiliza *ngIf para mostrar errores específicos:
<mat-error *ngIf="form.get('password').hasError('invalidPassword')"> La contraseña debe contener al menos un número. </mat-error>
Probando la validación
Para asegúrate de que tu validación funciona:
Con este proceso, no solo fortaleces la seguridad de tus formularios, sino que también ofreces una mejor experiencia de usuario. A medida que te familiarices con las validaciones personalizadas, encontrarás que puedes adaptar las reglas de acuerdo a las necesidades específicas de tu aplicación. ¡Anímate a seguir explorando y mejorando tus habilidades en Angular!
Félix Alejandro Zelaya Orellana
Genial!!
Seba Cardoso
Genial x2
Juan Luna
Buenas, profe ¿ 'function' dentro de class?, ¿cómo lo conseguiste?, a mi no me deja, poner un function en una class. o son métodos o son métodos estáticos, pero function no me deja, pero veo que a vos si, ¿cuál es el motivo?
Juan Luna
Rodrigo Josue Goitia Quiroga
Hola Juan
Tienes razón que no se puede utilizar function dentro de class.
En la clase en el minuto 9:30 el profesor sale del bloque de código que corresponde a class y agrega la función isNumber fuera de esta clase.
La diferencia es que cuando creas métodos estáticos es que estos corresponden a una clase. En cambio, las funciones que están fuera son totalmente independientes a la clase.
Rafael
podría facilitarme la dirección del curso completo de especialización en angular que menciona en el vídeo por favor
Tania Sosa
¡Hola compañero! 😄
Te comparto el Curso Profesional de Angular 8 espero te sea de utilidad.
Nunca pares de aprender 💚
Juan Pablo Rodríguez Morales
Esto debe estar muy fino para hacer llamados a apis o algún tipo de validación de ese tipo que sea más compleja.
Enmanuel Josue Sarmiento Benitez
Excelente, no conocía sobre estas validaciones personalizadas.
Johan Steward Galeano Torres
sucede algo si al importar en lugar de colocar from './../../../utils...' se coloca from 'src/app/utils' se me hace que se entiende más, pero no sé si afecta en algo
Nicolas Molina
ProfesorEn el curso de Angular Profesional vimos una genial técnica llamada los shorts imports:
https://platzi.com/clases/1731-angular-profesional/23603-implementando-short-imports-con-typescript/
Así evitas los /…/…/…/
Johan Steward Galeano Torres
no queda más fácil hacerlo con expresiones regulares? o es solo para el ejemplo?
Nicolas Molina
ProfesorSi con expresiones regulares también se puede solucionar aquí fue mas a modo de ejemplo de crear nuestras propias validaciones.
Osvaldo Andres Castellar Ahumada
d
Tuve que hacer esto para que me dejara en paz, el linter
static validatePassword(control: AbstractControl) { const value = control.value; if (!MyValidators.containsNumber(value)) { return {invalid_password: true}; } return null; } private static containsNumber(value: string): boolean { return value.split('').some(w => MyValidators.isNumber(w)) !== undefined; } private static isNumber(value:string): boolean { return !isNaN(parseInt(value, 10)); }