我在父组件中有一个提交按钮。我也有几个子组件。现在我想启用按钮以在验证通过后将表单的所有值保存在所有子组件中。在父组件中,我创建了表单组。
public mainForm: FormGroup;
Run Code Online (Sandbox Code Playgroud)
在父组件的构造函数中,
constructor(private fb: FormBuilder) {
this.mainForm = this.fb.group({
child1Form: this.fb.group({
projectName: [null, Validators.required],
projectSource: [null, Validators.required]
});
});
}
Run Code Online (Sandbox Code Playgroud)
在父 html 中,我们将表单传递给子级。
<div>
<app-child1 [child1Form]="mainForm.controls['child1Form']"></app-child1>
</div>
Run Code Online (Sandbox Code Playgroud)
在子组件html中,代码为:
<form [formGroup]="child1Form">
<div>
<input [(ngModel)]="projectName" formControlName="projectName">
</div>
<div>
<input [(ngModel)]="projectSource" formControlName="projectSource">
</div>
</form>
Run Code Online (Sandbox Code Playgroud)
在子组件的 ts 文件中,我们使用来自父组件的表单。
@Input() child1Form: any;
Run Code Online (Sandbox Code Playgroud)
我想要的是在ngOnInit父组件的,检查表单验证。
ngOnInit() {
this.mainForm.statusChanges.subscribe(data => {
const f = this.mainForm.controls['child1Form'];
if(f.valid || f.dirth)
// do something such as enable/disable the submit button
});
}
Run Code Online (Sandbox Code Playgroud)
但是我的问题是statusChanges即使我更改了子组件的输入控件中的文本,代码也没有到达部分。我假设当我输入某些内容时,表单的值或状态会发生变化,以便我可以进行验证。
小智 6
让我们一步步解决这个问题:
parent&child组件<form>
<app-child></app-child>
<button>Submit</button>
</form>
Run Code Online (Sandbox Code Playgroud)
<form [formGroup]="child1Form">
<div>
<input type="text" formControlName="projectName" required>
</div>
<div>
<input type="text" formControlName="projectSource" required>
</div>
</form>
Run Code Online (Sandbox Code Playgroud)
child1Form在child.component.ts 中创建一个 formGroup (我已经在 'child.component.ts' 中声明了 'child1Form' 而不是在 'parent.component.ts' 中) child1Form: FormGroup;
constructor(private fb: FormBuilder) { }
ngOnInit() {
this.child1Form = this.fb.group({
projectName: ['', Validators.required],
projectSource: ['', Validators.required]
})
}
Run Code Online (Sandbox Code Playgroud)
statusChanges并发出child.component.ts 中的值 @Output() isChild1FormValid: EventEmitter<boolean> = new EventEmitter<boolean>();
ngOnInit() {
this.child1Form.statusChanges.subscribe(value => {
if(value === 'VALID') {
this.isChild1FormValid.emit(true);
}
});
}
Run Code Online (Sandbox Code Playgroud)
<form>
<app-child (isChild1FormValid)="enableSubmitButton($event)"></app-child>
</form>
Run Code Online (Sandbox Code Playgroud)
isChild1FormValid: boolean;
enableSubmitButton(isValid: boolean) {
this.isChild1FormValid = isValid;
}
Run Code Online (Sandbox Code Playgroud)
isChild1FormValid属性为true ( parent.component.html ),则启用提交按钮<form>
<button type="submit" [disabled]="!isChild1FormValid">Submit</button>
</form>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4580 次 |
| 最近记录: |