En mi Angular 4 app, tengo un formulario con varios controles.

En algunos puntos necesito para forzar la actualización de su validez, por lo que yo estoy haciendo:

this.form.get('control1').updateValueAndValidity();
this.form.get('control2').updateValueAndValidity();
this.form.get('control3').updateValueAndValidity();
//and so on....

y luego:

this.form.updateValueAndValidity();

esto funciona bien.

Sin embargo, me preguntaba si hay una mejor manera para lograr la misma cosa, con sólo llamar a un método en el formulario principal.

De acuerdo a su documentación, el updateValueAndValidity() método:

Por defecto, se actualizará el valor y la validez de su antepasados.

pero en mi caso necesito actualizar el valor y la validez de su descendientes. Así que puede deshacerse de las muchas líneas de código.

  • ¿Probar algo a ver si se hace la actualización de sus descendientes?
  • algo como … ?
  • …no llamar a los descendientes’ métodos directamente en el primer lugar? Yo había pensado updateValueAndValidity también se aplica a los formularios hijos.
  • sí, por supuesto, y no funciona
  • Pregunta interesante. Yo creo que no está disponible fuera de la caja, no hay problema en este caso con markAsDirty: github.com/angular/angular/issues/11774 creo que es necesario hacer algunas de solución y recorrer las propiedades de un objeto en el padre y el uso updateValueAndValidity en cada control. Hmm. Sería práctico tho que estaría disponible sólo para llamar a los padres.
  • Vea la pregunta relacionada para algunas de las opciones: stackoverflow.com/questions/42235156/…

3 Comentarios

  1. 5

    He resuelto mi problema, que era similar a la tuya, por recursing los controles manualmente y la activación de la actualización.
    Probablemente esto no es una solución óptima:

    private triggerValidation(control: AbstractControl) {
        if (control instanceof FormGroup) {
            const group = (control as FormGroup);
    
            for (const field in group.controls) {
                const c = group.controls[field];
    
                this.triggerValidation(c);
            }
        }
        else if (control instanceof FormArray) {
            const group = (control as FormArray);
    
            for (const field in group.controls) {
                const c = group.controls[field];
    
                this.triggerValidation(c);
            }
        }
    
        control.updateValueAndValidity({ onlySelf: false });
    }
  2. 0
    validateFormFields(fields) {
        try {
          Object.entries(fields.controls).forEach((control: any) => {
            if (typeof control[0] == 'Array' 
            ) {
              this.validateFormFields(control[1]);
            } else {
              if (control[1].controls) {
                Object.entries(control[1].controls).forEach((c: any) => {
                  c[1].touched = true;
                });
              } else {
                control[1].touched = true;
              }
    
            }
          });
        } catch (e) {
          console.log(e);
        }
      }

Dejar respuesta

Please enter your comment!
Please enter your name here