Me gustaría markAsDirtytodos los controles dentro de un FormGroup.
Me gustaría markAsDirtytodos los controles dentro de un FormGroup.
Respuestas:
Descubrí que Object.keyspuede 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();
});
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
}
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();
}
});
}
instanceofsiempre trabajar después de haber sido transpiled de imprenta?
instanceofno es una palabra clave específica de TypeScript ( developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… ) Tampoco lo es el classtipo 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 ;)
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);
}
Object.keys( this.registerForm.controls).forEach(key => {
this.registerForm.controls[key].markAsDirty();
});
Creo esta función para que sea * Tengo un control con el nombre 'orden' y le paso el índice.
{"conditionGroups": [
{
"order": null,
"conditions": []
}
]
}
updateFormData() {
const control = <FormArray>this.form.controls['conditionGroups'];
control.value.map((x,index)=>{
x.order = index;
})
Cannot invoke an expression whose type lacks a call signature. Type 'AbstractControl' has no compatible call signatures.¿Alguien sabe por qué?