最近、ng 7.2.15 と typescript 3.2.4 から angular v8.2.14 と typescript v3.5.3 にアップグレードしました。親コンポーネントから子コンポーネントにフォーム グループを渡すことができなくなりました。
以下は私の子コンポーネントです: child component.ts
@Component({selector:'edit-overview'})
export class ChildComponent implements OnInit {
public OverviewFormGroup : FormGroup
constructor(private controlContainer: ControlContainer) {
}
ngOnInit() {
this.OverviewFormGroup = <FormGroup>this.controlContainer.control;
}
}
子コンポーネント.html
<div [formGroup] ='OverviewFormGroup'>
</div>
そして私の親コンポーネント
親.コンポーネント.html
<div [formGroup]="Form1">
<edit-overview [formGroup]="Form1.controls.OverviewFormGroup">
</edit-overview>
</div>
親.コンポーネント.ts
export class ParentComponent {
constructor(private readonly fb: FormBuilder) {
this.Form1 = this.fb.group({
name: new FormControl('', [Validators.required]),
OverviewFormGroup: new FormGroup({
description: new FormControl('', [Validators.nullValidator])
})
})
}
}
次のエラーがスローされます: タイプ 'AbstractControl' には、タイプ 'FormGroup' の次のプロパティがありません: controls、registerControl、addControl、removeControl、および親テンプレート行の 3 つ以上。
以前は、フォーム グループを親から子に渡すことは問題ではなくなりました。ここで何か見落としているのでしょうか? フォーム グループ宣言でコントロールに値を既に指定しています。
ベストアンサー1
いい質問ですね。これはわかりにくいエラーです。このエラーは型安全機能から発生します。Angularはアクセス方法からフォームグループであるかどうかを知ることができないため( であることしか知りませんAbstractFormControl
)、それを伝えます!
オプション1:as
型を明示的にするために使用する
たとえば、次のような場合です。
mainForm: FormGroup = this.formBuilder.group({
name: ['Max'],
address: this.formBuilder.group({
street: ['PayneStreet'],
zip: [50000]
})
});
実際にフォーム コントロールにアクセスしていることを Angular に知らせるには、次のことを伝える必要があります。
get addressForm() {
return this.mainForm.get('address') as FormGroup;
}
重要なのはas FormGroup
. このように、Angular はそれがFormGroup
単なる抽象的なフォーム コントロールではなく、実際には であることを認識します。次に、HTML でそれを使用できます。
<app-address-form [addressForm]="addressForm"></app-address-form>
StackBlitz はここから見つかります:https://stackblitz.com/edit/angular-nested-forms-input
オプション2(推奨): ネストされたグループを個別に定義する
実際には、2 番目のフォームを個別に構築し、それをメイン フォームにアタッチする方が簡単で型安全です。
addressForm = this.formBuilder.group({
street: ["PayneStreet"],
zip: [50000]
});
mainForm: FormGroup = this.formBuilder.group({
name: ["Max"],
address: this.addressForm
});
そしてHTMLでは(上記と同じ)
<app-address-form [addressForm]="addressForm"></app-address-form>
このように、Angularは既にaddressForm
型が型であることを知っておりFormGroup
、型だけではないことを知っていますAbstractFormControl
スタックブリッツ:https://stackblitz.com/edit/angular-nested-forms-input-2