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
}
受け入れられた答えはフラットフォーム構造に対して正しいですが、元の質問に完全には答えていません。Webページにはネストされた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();
}
});
}
instanceofTypescriptによってトランスパイルされた後は常に機能しますか?
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 機能は、角8でフォーム内の特定の値を取得するためのもう働いていないので、これは私が@Liviuアイリーの回答に基づいて、それを解決する方法です。
for (const field in this.myForm.controls) { // 'field' is a string
console.log(this.myForm.controls[field].value);
}
この関数を作成して作成します*「order」という名前のコントロールがあり、インデックスを彼に渡します。
{"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.が発生します。理由はわかりますか?