【发布时间】:2020-08-17 04:06:27
【问题描述】:
在我的主组件中,我呈现了一个表单,其表单组位于子组件中。主组件使用一些默认值进行初始化,子组件使用一些验证器和其他逻辑进行自身初始化。
现在我在想,通过主窗体上的valueChanges 订阅,主组件会以某种方式自动获取子窗体组中的更改。但是缺少一个连接部分,因为即使子表单组中存在验证错误,表单也始终是“有效的”。
我错过了什么?
main.component.ts:
ngOnInit() {
this.initializeFormGroup();
this.form.valueChanges.subscribe(
result => console.log(this.form.valid); // always outputs true!?
);
});
}
private initializeFormGroup(): void {
this.form = this.formBuilder.group({
child1: this.formBuilder.group({}),
child2: this.formBuilder.group({})
});
}
main.component.html:
<form [formGroup]="form">
<child1></child1>
<child2></child2>
</form>
child1.component.ts:
form: FormGroup;
ngOnInit(): void {
this.initializeFormGroup();
this.checkStuffAndAddValidators();
}
get formArray(): FormArray {
return this.form.get('array') as FormArray;
}
private initializeFormGroup(): void {
this.form = this.formBuilder.group({
array: this.formBuilder.array([])
});
}
private checkStuffAndAddValidators(): any {
const newGroup = this.formBuilder.group({
inputA: ['', [Validators.required]],
inputB: ['']
});
if (this.someConditionIsTrue) {
newGroup
.get('inputB')
.setValidators([MyValidator]);
newGroup.updateValueAndValidity();
}
this.array.push(newGroup);
});
}
child1.component.html:
<div [formGroup]="form">
<div formArrayName="array" *ngFor="let control of formArray.controls; let i = index">
<ng-container formGroupName="{{ i }}">
<input name="inputA" formControlName="inputA" />
<input name="inputB" formControlName="inputB" />
</ng-container>
</div>
child2.component.ts:
form: FormGroup;
ngOnInit(): void {
this.initializeFormGroup();
}
get formArray(): FormArray {
return this.form.get('array') as FormArray;
}
addInput() {
if (!this.formArray.valid) {
return;
}
this.formArray.push(this.createNewFormGroup());
}
removeInput(index: number) {
this.formArray.removeAt(index);
}
private initializeFormGroup(): void {
this.form = this.formBuilder.group({
array: this.formBuilder.array([this.createNewFormGroup()])
});
}
private createNewFromGroup(): FormGroup {
return this.formBuilder.group({
inputA: ['', [Validators.required]],
inputB: ['', [Validators.required]]
});
child2.component.html:
<div [formGroup]="form">
<div formArrayName="array" *ngFor="let control of formArray.controls; let i = index">
<ng-container formGroupName="{{ i }}">
<input name="inputA" formControlName="inputA" />
<a (click)="removeInput(i)">del</a>
<a (click)="addInput()">add</a>
<input name="inputB" formControlName="inputB" />
<a (click)="removeInput(i)">del</a>
<a (click)="addInput()">add</a>
</ng-container>
</div>
【问题讨论】:
标签: angular angular-reactive-forms angular-forms angular-validation