Я хотел бы, чтобы markAsDirty
все элементы управления внутри файла FormGroup
.
97
Выяснилось, что Object.keys
справится с этим ..
Object.keys(this.form.controls).forEach(key => {
this.form.get(key).markAsDirty();
});
Для Angular 8+ используйте следующее (на основе ответа Микеланджело):
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.
Кто-нибудь знает, почему?Как бы то ни было, есть другой способ сделать это без использования магии Object.keys (...) :
for (const field in this.form.controls) { // 'field' is a string const control = this.form.get(field); // 'control' is a FormControl }
источник
Принятый ответ верен для плоской конструкции, но не полностью отвечает на исходный вопрос. Веб-страница может потребовать вложенных FormGroups и FormArrays, и мы должны учитывать это, чтобы создать надежное решение.
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(); } }); }
источник
instanceof
всегда будет работать после преобразования с помощью Typescript?instanceof
не является ключевым словом, специфичным для TypeScript ( developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… ). Иclass
тип данных тоже.Используя ответ @Marcos, я создал функцию, которую можно вызвать с передачей formGroup в качестве параметра, и она помечает все дочерние элементы управления formGroup как грязные, просто чтобы сделать их пригодными для использования из большего количества мест вокруг кода, например, поместив их внутри службы.
public touchAllFormFields(formGroup: FormGroup): void { Object.keys(formGroup.controls).forEach((key) => { formGroup.get(key).markAsDirty(); }); }
Надеюсь, это поможет ;)
источник
Похоже, эта
get
функция больше не работает для получения определенных значений в вашей форме в Angular 8, поэтому я решил ее на основе ответа @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(); });
источник
Это то, что у меня работает
private markFormGroupTouched(formGroup: FormGroup) { Object.keys(formGroup.controls).forEach((key) => { const control = formGroup.controls[key]; control.markAsDirty(); if ((control instanceof FormGroup)) { this.markFormGroupTouched(control); } }); }
источник
Я создаю эту функцию, чтобы сделать это * У меня есть элемент управления с именем «порядок» и передаю ему индекс.
источник