Chciałbym markAsDirty
wszystkie elementy sterujące wewnątrz pliku FormGroup
.
97
Okazało się, że Object.keys
sobie z tym poradzę
Object.keys(this.form.controls).forEach(key => {
this.form.get(key).markAsDirty();
});
W przypadku Angular 8+ użyj następującego (na podstawie odpowiedzi Michała Anioła):
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.
Czy ktoś wie dlaczego?Warto, jest inny sposób na zrobienie tego bez konieczności używania magii Object.keys (...) :
for (const field in this.form.controls) { // 'field' is a string const control = this.form.get(field); // 'control' is a FormControl }
źródło
Przyjęta odpowiedź jest prawidłowa dla płaskiej konstrukcji formy, ale nie odpowiada w pełni na pierwotne pytanie. Strona internetowa może wymagać zagnieżdżonych FormGroups i FormArrays i musimy wziąć to pod uwagę, aby stworzyć solidne rozwiązanie.
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(); } }); }
źródło
instanceof
zawsze działać po transpozycji przez maszynopis?instanceof
nie jest słowem kluczowym specyficznym dla języka TypeScript ( developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… ) Nie jest teżclass
typem danych.Korzystając z @Marcos answer, stworzyłem funkcję, którą można nazwać przekazując parametr formGroup jako parametr i zaznacza ona wszystkie kontrolki podrzędne formGroup jako brudne, aby umożliwić jej użycie z większej liczby miejsc w kodzie, na przykład umieszczając ją w usłudze.
public touchAllFormFields(formGroup: FormGroup): void { Object.keys(formGroup.controls).forEach((key) => { formGroup.get(key).markAsDirty(); }); }
mam nadzieję, że to pomoże ;)
źródło
Wygląda na to, że
get
funkcja nie działa już przy pobieraniu określonych wartości w formularzu w Angular 8, więc tak to rozwiązałem na podstawie odpowiedzi @Liviu Ilea.for (const field in this.myForm.controls) { // 'field' is a string console.log(this.myForm.controls[field].value); }
źródło
Object.keys( this.registerForm.controls).forEach(key => { this.registerForm.controls[key].markAsDirty(); });
źródło
To właśnie działa dla mnie
private markFormGroupTouched(formGroup: FormGroup) { Object.keys(formGroup.controls).forEach((key) => { const control = formGroup.controls[key]; control.markAsDirty(); if ((control instanceof FormGroup)) { this.markFormGroupTouched(control); } }); }
źródło
Tworzę tę funkcję, aby * * Mam kontrolkę z nazwą 'order' i przekazałem mu indeks.
źródło