Javascript 如何在angular中正确设置表单验证
使用角度版本11.1.2 因此,在我的项目中,有一个简单的输入字段,使用angular material设置样式,在重定向到新页面之前输入名称,下面是我在Form control中设置的一些验证器:Javascript 如何在angular中正确设置表单验证,javascript,html,angular,Javascript,Html,Angular,使用角度版本11.1.2 因此,在我的项目中,有一个简单的输入字段,使用angular material设置样式,在重定向到新页面之前输入名称,下面是我在Form control中设置的一些验证器: 必需的 最小长度为5 最大长度为25 在所有上述验证器检查完毕后;通过(/api/check/:name)上的api请求,它返回true(如果名称已经存在)和false(如果名称不存在)——(这一个当前未在代码中实现,我认为必须使用自定义异步验证器) 我还在输入字段上设置了自动对焦;加载组件后,焦点
/api/check/:name
)上的api请求,它返回true(如果名称已经存在)和false(如果名称不存在)——(这一个当前未在代码中实现,我认为必须使用自定义异步验证器)✔ 对于有效用户名
和❌ 对于无效的表单输入
,还有一个mat progress微调器
,用于显示异步验证程序正在工作
这是我的component.html:
输入您的用户名
清楚的
完成
{{getErrorMessage()}}
登录
登录
首先,对每个属性进行解释:
- valid:如果所有验证器都有效,则为true
- 无效:如果一个验证器无效,则为true
- 脏:将在FormControl值更改时变为真
- pristine:只要您的FormControl值没有被更改,它将是真的
- 触摸:一旦你的元素失去焦点,就会变成现实(类似于onBlur)
- 未触及:只要您的元素未被触及,则为真
- 挂起:用于异步验证
清楚的
完成
从@Leccho的回复中,向组件添加以下customErrorStateMatcher
类解决了问题
//用于在显示错误时更改行为的新类
类CustomErrorStateMatcher实现ErrorStateMatcher{
isErrorState(控件:FormControl | null,形式:FormGroupDirective | NgForm | null):布尔值{
return!!(control&&control.invalid&&control.dirty | | control.tocked));
}
}
@组成部分({
选择器:“应用程序主页”,
templateUrl:“./home.component.html”,
样式URL:['./home.component.scss']
})
导出类HomeComponent实现OnInit{
私有主虚拟路径:字符串;
用户名=新表单控件(空[
需要验证器,
验证器。最小长度(5),
验证器.模式('^[a-zA-Z0-9_]*$)
]);
matcher=新的CustomErrorStateMatcher();
构造函数(){
}
ngOnInit():void{
//this.username.markAsTouched();
}
getErrorMessage():字符串{
if(this.username.hasError('required')&&this.username.dirty){
return“您不能将用户名留空!”;
}else if(this.username.hasError('minlength')&&this.username.dirty){
return“用户名长度必须至少为5个字母!”;
}else if(this.username.hasError('pattern')&&this.username.dirty){
return“仅允许[a-z、a-z和z]作为有效用户名!”;
}
返回“”;
}
navigateToUserWindow():void{
this.route.navigate(['user']);
}
}
ok,上面的html仅适用于表单无效、有效或处于挂起状态的指示符,但当用户在框中键入时,如何在mat error
中显示错误消息只有那些图标指示符在更改,但表单无效时不显示错误。只有当用户将焦点从错误上的输入元素中移除时,才会显示这些错误。当用户直接输入用户输入时,如何显示错误?默认情况下,只要输入无效,只要您松开输入焦点,mat error将立即显示。如果你想改变这一点,你必须自己定制ErrorStateMatcher。如果你用谷歌搜索,你应该有很多例子。啊,我看到你在上面添加了ngIf。您可以删除它。这是自动处理的。