Saltar al contenido

Angular 2 FormGroup Agregar validadores dinámicos

Después de de nuestra extensa búsqueda de datos pudimos solucionar esta incógnita que suelen tener ciertos los lectores. Te compartimos la respuesta y nuestro deseo es serte de mucha apoyo.

Solución:

Prueba esto, debería funcionar

this.formGroup.controls["firstName"].setValidators(Validators.required);

Para múltiples validadores

this.formGroup.controls["firstName"].setValidators([Validators.required, Validators.minLength(2)]);

Pero hacerlo anulará cualquier validador que se proporcione durante la inicialización.

EDITAR :

Para reflejar los controles de formulario con los recién agregados Validators inmediatamente, tenemos que llamar this.formGroup.controls["firstName"].updateValueAndValidity(); después de configurar validadores dinámicamente.

this.formGroup.controls["firstName"].setValidators(Validators.required);
this.formGroup.controls["firstName"].updateValueAndValidity();

DEMO para el mismo

* NOTA *

updateValueAndValidity() activará un evento valueChanges incluso si el valor realmente no cambió (lo que podría generar un bucle infinito, si lo llama desde una suscripción valueChanges). Puede evitar eso usando el objeto de parámetro opcional: onlySelf: trueemitEvent: false

Si bien la respuesta de Amit Chigadani es correcta, tenga en cuenta lo siguiente.

Si bien esta solución funciona para actualizar validadores, los nuevos validadores no se ejecutarán hasta que cambie el valor de los campos del formulario. por lo tanto, se recomienda ejecutar la siguiente función inmediatamente después de actualizar sus validadores;)

En términos simples: agregue la línea, si desea que sus clases ng-valid y ng-invalid se actualicen.

this.formGroup.controls["firstName"].setValidators([Validators.required, Validators.minLength(2)]);
this.formGroup.controls["firstName"].updateValueAndValidity();

En caso de que solo desee actualizar el valor y la validez de este control único, agregue esta opción

this.formGroup.controls["firstName"].setValidators([Validators.required, Validators.minLength(2)]);
this.formGroup.controls["firstName"].updateValueAndValidity(onlySelf: true);

Otra nota al margen. En Angular2, uno no debería usar el array sintaxis para obtener controles de grupos de formularios, pero esto

this.formGroup.get("firstName");

Que también acepta la notación de punto

this.formGroup.get("userSectionFormGroup.firstName");

obtuve la solución que podemos hacer con el siguiente código.

const validators = new Array();
          validations.forEach(validation => 
            switch (validation.Type) 
              case 'required':
                validators.push(Validators.required);
                break;
              case 'minLength':
                validators.push(Validators.minLength(parseInt(validation.Expression, 10)));
                break;
              case 'maxLength':
                validators.push(Validators.maxLength(parseInt(validation.Expression, 10)));
                break;
              case 'pattern':
                validators.push(Validators.pattern(validation.Expression));
                break;
            
          );
          this.form.controls[i].setValidators(validators);
 }
      }
    });

Valoraciones y comentarios

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

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