Me gustaría markAsDirty
todos los controles dentro de un FormGroup
.
97
Descubrí que Object.keys
puede manejar esto ...
Object.keys(this.form.controls).forEach(key => {
this.form.get(key).markAsDirty();
});
Para Angular 8+, use lo siguiente (basado en la respuesta de Miguel Ángel):
Object.keys(this.form.controls).forEach(key => {
this.form.controls[key].markAsDirty();
});
Cannot invoke an expression whose type lacks a call signature. Type 'AbstractControl' has no compatible call signatures.
¿Alguien sabe por qué?Por lo que vale, hay otra forma de hacer esto sin tener que usar la magia Object.keys (...) :
for (const field in this.form.controls) { // 'field' is a string const control = this.form.get(field); // 'control' is a FormControl }
fuente
La respuesta aceptada es correcta para una estructura de forma plana, pero no responde completamente a la pregunta original. Una página web puede requerir FormGroups y FormArrays anidados, y debemos tener esto en cuenta para crear una solución sólida.
public markControlsDirty(group: FormGroup | FormArray): void { Object.keys(group.controls).forEach((key: string) => { const abstractControl = group.controls[key]; if (abstractControl instanceof FormGroup || abstractControl instanceof FormArray) { this.markControlsDirty(abstractControl); } else { abstractControl.markAsDirty(); } }); }
fuente
instanceof
siempre trabajar después de haber sido transpiled de imprenta?instanceof
no es una palabra clave específica de TypeScript ( developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… ) Tampoco lo es elclass
tipo de datos.Usando la respuesta de @Marcos, creé una función a la que se puede llamar pasando un formGroup como parámetro y marca cada control infantil de formGroup como sucio, solo para que se pueda usar desde más lugares alrededor del código colocándolo dentro de un servicio, por ejemplo.
public touchAllFormFields(formGroup: FormGroup): void { Object.keys(formGroup.controls).forEach((key) => { formGroup.get(key).markAsDirty(); }); }
Espero eso ayude ;)
fuente
Parece que la
get
función ya no funciona para recuperar valores específicos en su formulario en Angular 8, así que así es como lo resolví en función de la respuesta de @Liviu Ilea.for (const field in this.myForm.controls) { // 'field' is a string console.log(this.myForm.controls[field].value); }
fuente
Object.keys( this.registerForm.controls).forEach(key => { this.registerForm.controls[key].markAsDirty(); });
fuente
Esto es lo que funciona para mi
private markFormGroupTouched(formGroup: FormGroup) { Object.keys(formGroup.controls).forEach((key) => { const control = formGroup.controls[key]; control.markAsDirty(); if ((control instanceof FormGroup)) { this.markFormGroupTouched(control); } }); }
fuente
Creo esta función para que sea * Tengo un control con el nombre 'orden' y le paso el índice.
fuente