Я хотел бы, чтобы markAsDirty
все элементы управления внутри файла FormGroup
.
Я хотел бы, чтобы markAsDirty
все элементы управления внутри файла FormGroup
.
Ответы:
Выяснилось, что 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();
});
Как бы то ни было, есть другой способ сделать это без использования магии 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();
});
Я создаю эту функцию, чтобы сделать это * У меня есть элемент управления с именем «порядок» и передаю ему индекс.
{"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.
Кто-нибудь знает, почему?