Eu gostaria de markAsDirtytodos os controles dentro de um FormGroup.
Eu gostaria de markAsDirtytodos os controles dentro de um FormGroup.
Respostas:
Descobri que Object.keyspode lidar com isso ..
Object.keys(this.form.controls).forEach(key => {
this.form.get(key).markAsDirty();
});
Para Angular 8+, use o seguinte (com base na resposta de Michelangelo):
Object.keys(this.form.controls).forEach(key => {
this.form.controls[key].markAsDirty();
});
Pelo que vale a pena, há outra maneira de fazer isso sem ter que usar a magia Object.keys (...) :
for (const field in this.form.controls) { // 'field' is a string
const control = this.form.get(field); // 'control' is a FormControl
}
A resposta aceita está correta para uma estrutura de formulário plano, mas não responde completamente à pergunta original. Uma página da web pode exigir FormGroups e FormArrays aninhados, e devemos levar isso em consideração para criar uma solução robusta.
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();
}
});
}
instanceofsempre trabalhar depois de ser transpiled por Typescript?
instanceofnão é uma palavra-chave específica do TypeScript ( developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… ) Nem o classtipo de dados.
Parece que a get função não está mais funcionando para recuperar valores específicos em seu formulário no Angular 8, então foi assim que resolvi com base na resposta de @Liviu Ilea.
for (const field in this.myForm.controls) { // 'field' is a string
console.log(this.myForm.controls[field].value);
}
Usando a resposta @Marcos criei uma função que pode ser chamada passando um formGroup como parâmetro e marca todos os controles filhos de formGroup como sujos, apenas para torná-lo utilizável de mais lugares ao redor do código colocando-o dentro de um serviço, por exemplo.
public touchAllFormFields(formGroup: FormGroup): void {
Object.keys(formGroup.controls).forEach((key) => {
formGroup.get(key).markAsDirty();
});
}
espero que ajude ;)
Object.keys( this.registerForm.controls).forEach(key => {
this.registerForm.controls[key].markAsDirty();
});
Eu crio esta função para torná-la * Eu tenho um controle com o nome 'pedido' e passo o índice para ele.
{"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.. Alguém sabe por quê?