【发布时间】:2019-03-26 13:00:06
【问题描述】:
我在 Angular 7 上,我正在为我的一种形式使用反应形式,代码如下。 (StackblitzHere)
模板
<form [formGroup]="SignupForm" *ngIf="SignupForm">
<input type="text" class="form-control" id="username" formControlName = "username">
<div *ngIf="SignupForm.errors?.errors">Error</div>
</form>
打字稿
export class AppComponent implements OnInit {
SignupForm: FormGroup;
constructor() {
}
ngOnInit() {
setTimeout(() => {
this.SignupForm = new FormGroup({
'username': new FormControl('Value'),
'email': new FormControl()
});
this.SignupForm.setErrors({errors: 'Error'});
})
}
}
如您所见,我试图在表单初始化后立即设置错误(在我的实际情况下,我会根据后端数据进行一些验证,然后执行此操作。)。但即使 SignupForm.errors 设置了错误对象,错误似乎也没有出现。
但如果我这样做了
setTimeout(() => { this.SignupForm.setErrors({errors: 'Error'});})
一切正常。我做错了什么还是我可以报告的角度错误。请帮忙。谢谢。
注意
实际上,我的表单来自异步的后端。在我从元数据创建表单后,我进行验证并设置错误。所以移动到任何生命周期钩子都不会改变我认为的任何行为。
【问题讨论】:
-
我感觉错误消息没有显示,因为您的表单是原始的。您是否尝试将表单或单个控件标记为“脏”和“已触摸”?如果我记得你需要调用的方法是 markAsDirty 和 markAsTouched
-
但它似乎在 setTimeout 之后工作。如果控制是原始的是问题,它也不应该那样工作,对吗?如果我遗漏了什么,请纠正我。
-
确实如此,您是否尝试过将代码移至 ngAfterViewInit 挂钩?
-
ngAfterViewInit 会起作用。
<div [hidden]="SignupForm.errors?.errors">Error</div>也可以使用 -
实际上我的表单来自异步的后端。在我从元数据创建表单后,我进行验证并设置错误。所以移动到任何生命周期钩子都不会改变我认为的任何行为。
标签: angular angular7 angular-reactive-forms