我有一个父组件,它是主要的FormGroup
。在此<my-parent></my-parent>
组件内部,有一个子组件<my-child></my-child>
。
子组件有一个*ngIf="some-conditional"
,在子组件中,我有一个快速填充按钮,该按钮基本上可以在一对夫妇上执行patchValue
FormGroup
的孩子控制。
它已成功将子级FormGroup
添加到父级FormGroup
,但是父级内部的子级的值始终为空。
我试图通过两种方式(均不成功)添加控件,即在父组件内部添加一个setter,并从子组件内部进行发射,然后将新值重新分配给父FormGroup
。
这里是stackblitz,其中包含我正在尝试做的事的演示。预先感谢!
// PARENT COMPONENT
import {
Component,
ViewChild
} from '@angular/core';
import {
FormBuilder,
FormGroup,
Validators
} from '@angular/forms';
import {
ChildComponent
} from './child.component';
@Component({
selector: 'my-parent',
templateUrl: './parent.component.html',
styleUrls: ['./app.component.scss']
})
export class ParentComponent {
isChildFormSet = false;
showChildComponent = false;
exampleParentForm: FormGroup;
// @ViewChild(ChildComponent)
// set userForm(childForm: ChildComponent) {
// if (childForm && !this.isChildFormSet) {
// this.isChildFormSet = true;
// setTimeout(() => {
// this.exampleParentForm.addControl('child', new FormGroup(childForm.exampleChildForm.controls));
// });
// }
// }
constructor(private fb: FormBuilder) {
this.exampleParentForm = this.fb.group({
parent: ['', Validators.required]
})
}
submitForm(): void {
console.log(this.exampleParentForm)
}
addChildComponent(): void {
this.showChildComponent = true;
}
onChange(form) {
// reset the form value to the newly emitted form group value.
this.exampleParentForm = form;
}
}
// CHILD COMPONENT
import {
Component,
OnInit,
Input,
Output,
EventEmitter
} from '@angular/core';
import {
FormBuilder,
FormGroup,
Validators
} from '@angular/forms';
@Component({
selector: 'my-child',
templateUrl: './child.component.html',
styleUrls: ['./app.component.scss']
})
export class ChildComponent implements OnInit {
exampleChildForm: FormGroup;
@Input() formData: FormGroup;
@Output() onFormGroupChange: EventEmitter < FormGroup > = new EventEmitter < FormGroup > ();
constructor(private fb: FormBuilder) {}
ngOnInit() {
this.exampleChildForm = this.fb.group({
child: ['', Validators.required]
});
this.addGroupToParent();
}
fillWithText() {
this.exampleChildForm.patchValue({
child: 'This is an exmple.'
});
}
clearText(): void {
this.exampleChildForm.get('child').setValue('');
}
private addGroupToParent(): void {
this.formData.addControl('child', new FormGroup(this.exampleChildForm.controls));
this.onFormGroupChange.emit(this.formData);
}
}
<!-- PARENT COMPONENT -->
<div class="parent-container">
<form [formGroup]="exampleParentForm" (submit)="submitForm()" novalidate>
<div class="col-3">
<input class="effect-1" type="text" placeholder="Parent Input" formControlName="parent" />
<span class="focus-border"></span>
</div>
<my-child *ngIf="showChildComponent" [formData]="exampleParentForm" (onFormGroupChange)="onChange($event)">
</my-child>
<div>
<button class="button parent" type="submit">Log Form Value</button>
</div>
</form>
<button class="button small" type="button" (click)="addChildComponent()">Add Child Component</button>
</div>
<!-- CHILD COMPONENT -->
<div class="child-container" [formGroup]="exampleChildForm">
<div class="col-3">
<input class="effect-1" type="text" placeholder="Child Input" formControlName="child">
<span class="focus-border"></span>
</div>
<div>
<button class="button child" type="button" (click)="fillWithText()">Patch Value</button>
</div>
</div>
答案 0 :(得分:2)
无需将新的FormGroup实例添加到父组中,只需添加子表单组本身即可。
所以
this.formData.addControl('child', new FormGroup(this.exampleChildForm.controls));
成为
this.formData.addControl('child', this.exampleChildForm);