Búsqueda de sitios web

javascript - La validación de repetir contraseña no funciona


Estoy intentando validar la contraseña y repetir la contraseña en un formulario. Así:

import { FormGroup, FormBuilder, Validators, AbstractControl } from '@angular/forms';

 this.registerForm = fb.group({
        name: ['', Validators.required],
        email: ['', Validators.compose([Validators.pattern("[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"), Validators.required])],
        passwords: this.fb.group({
            password: ['', Validators.compose([Validators.required])],
            repassword: ['', Validators.compose([Validators.required])]
          }, this.comparePassword)
    });

function comparePassword(c: AbstractControl) {
return c.get('password').value === c.get(' repassword').value

}

** También intenté pasar return false en comparePassword como:

comparePassword(c: AbstractControl) {
      return false;
  }

** pero cada vez console.log(this.registerForm.valid); me da true, pero debería devolver false si estoy dando diferentes entradas en contraseña y repetir contraseña. Así que por favor ayúdenme a resolver esto. Gracias de antemano

Respuesta #1

Una cosa extraña: la validación personalizada debería devolver null cuando es válida.

Si la validación falla, deberías devolver un error de validación { "comparePassword": true }

Entonces creo que tu función debería ser:

comparePassword(control: AbstractControl) {
    if(control.get('password').value === control.get('repassword').value){
        return null;
    }

    return { “comparePassword”: true };
}

Validación personalizada en Angular.io: Esa función toma un objeto de control de Angular y devuelve null si el valor del control es válido, o un objeto de error de validación. El objeto de error de validación típicamente tiene una propiedad cuyo nombre es la clave de validación, 'forbiddenName', y cuyo valor es un diccionario arbitrario de valores que podrías insertar en un mensaje de error ({name}).

Respuesta #2

Esto debería funcionar

  comparePassword = (control: AbstractControl): {[key: string]: boolean} => {
    // get values
    const password = control.get('password');
    const repassword = control.get('repassword');
    // if no values, validated as true
    if (!password || !repassword) {
      return null;
    }
    // if values match, return null, else nomatch: true
    return password.value === repassword.value ? null : { nomatch: true };
  };

y luego en tu construcción de formulario, establece:

{validator: this.comparePassword}

en

this.registerForm = fb.group({
    name: ['', Validators.required],
    email: ['', Validators.compose([Validators.pattern("[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"), Validators.required])],
    passwords: this.fb.group({
        password: ['', Validators.compose([Validators.required])],
        repassword: ['', Validators.compose([Validators.required])]
      },{validator: this.comparePassword}) // here
});