Angular 中带有子组件的反应式形式

Hec*_*tor 3 javascript typescript angular

如您所见,我有一个带有子组件的父表单组件。{{myFormFather.value}} 显示我的nickName价值和name价值,但不显示age价值。{{myFormFather.status}} 它不识别组件子级。就像我的孩子是一个幻影,为什么?

我的-form-father.html

<form [formGroup]="myFormFather" (ngSubmit)="onSubmit()">
    <input formControlName="nickName">
    <input formControlName="name">
    <my-form-child
            [age]="myFormFather">
    </my-form-child>
    <button type="submit"
            [disabled]="myFormFather.invalid">Save
    </button>
</form>
Run Code Online (Sandbox Code Playgroud)

my-form-father.ts

myFormFather = new FormGroup({
    nickName: new FormControl(),
    name: new FormControl()
});

constructor(private fb:FormBuilder) {}

ngOnInit() {this.createForm()}

createForm() {
    this.myFormFather = this.fb.group({
        nickName: ['', [Validators.required],
        name: ['', [Validators.required]
    });
}
Run Code Online (Sandbox Code Playgroud)

my-form-child.html

<div [formGroup]="ageForm">
    <input formControlName="age">
</div>
Run Code Online (Sandbox Code Playgroud)

my-form-child.ts

@Input() ageForm = new FormGroup({
    age: new FormControl()
});

constructor(private fb:FormBuilder) {}

ngOnInit() {this.createForm()}

createForm() {
    this.ageForm = this.fb.group({
        age: ['', [Validators.required]]
    });
}
Run Code Online (Sandbox Code Playgroud)

Abh*_*r ツ 5

您好,您一直在寻找的解决方案

演示堆栈闪电战

问题是:您覆盖了从父级传递的表单组

@Input() ageForm = new FormGroup({
  age: new FormControl()
});

constructor(private fb: FormBuilder) {}

ngOnInit() {
  this.createForm()
}

createForm() {
  // This is overwriting the FormGroup passed from parent!
  this.ageForm = this.fb.group({
    age: ['', [Validators.required]]
  });

  // Instead you had to use
  // this.ageForm.addControl("age", new FormControl('', Validators.required));
}
Run Code Online (Sandbox Code Playgroud)

  • 我只是想在这里评论一下,这个针对子表单组件的解决方案被严重低估了。通常,对于父/子反应式表单,父级决定整个表单结构,这似乎总是违背了拥有子组件的目的。这允许子组件管理自己的表单组,这实际上将其与父组件完全解耦,这非常棒。 (2认同)