angular - Angular:在更改另一个表单控件时触发表单控件验证
问题描述
请在 此处参考 stackblitz 中的项目。
可以看出,我有控件的反应形式firstNumber
,secondNumber
和thirdNumber
。我需要对表单控件进行验证thirdNumber
,使其值不应大于在firstNumber
和之间具有最小值的表单控件的值secondNumber
。
validateThirdNumber
每当表单控件更改时,组件中的自定义验证器都可以正常工作thirdNumber
,但是我需要对表单控件的更改进行验证,firstNumber
因为secondNumber
验证逻辑可以根据表单控件的更改
firstNumber
和secondNumber
.
为此,我添加了一个更改表单控件的事件,firstNumber
并且secondNumber
我将表单控件标记thirdNumber
为touched
但似乎没有触发其验证。
那么,如何对表单控件thirdNumber
的更改和表单控件firstNumber
进行验证secondNumber
?
此外,即使在绑定到其this.myFormGroup
表单控件声明并app.componen.ts
在?line:22
this
this.myFormGroup
constructor
解决方案
您最好的选择是创建您自己的自定义全局验证器。
class ValidateThirdNumber {
static validate(control: AbstractControl) {
console.log(control);
if(control) {
const firstNumber = control.get('firstNumber').value;
const secondNumber = control.get('secondNumber').value;
const thirdnumber = control.get('thirdNumber').value;
if (firstNumber > secondNumber) {
if (thirdnumber > secondNumber) {
control.get('thirdNumber').setErrors( {greaterThanSecondNumber: true} );
}
} else if (firstNumber < secondNumber) {
if (thirdnumber > firstNumber) {
control.get('thirdNumber').setErrors( {greaterThanFirstNumber: true} );
}
}
}
return null;
}
}
表单组的初始化应该是:
this.myFormGroup = this.fb.group({
firstNumber: [0],
secondNumber: [0],
thirdNumber: [0]
}, {validator: [ValidateThirdNumber.validate] });
你不再需要touched属性
<span *ngIf="myFormGroup.get('thirdNumber').errors?.greaterThanFirstNumber">
Third number cannot be greater than First Number
</span>
<span *ngIf=" myFormGroup.get('thirdNumber').errors?.greaterThanSecondNumber">
Third number cannot be greater than Second Number
</span>
你也不需要(change)
事件删除它们
推荐阅读
- reactjs - React.js:我无法通过父组件为两个子组件之间的交换编写回调
- ios - 如何修复 TabView 在横向模式下重叠最后一个列表项?
- regex - 在 Vim 中忽略部分搜索模式中的大小写
- node.js - NodeJS fetch 在 fs.writeFile 回调中执行时返回 ECONNREFUSED 错误
- javascript - 如何创建对象作为参数?
- python - 将数据框作为 parquet 文件加载到 Google 云存储
- c - GCD 函数的时间复杂度
- hive - Tez FileNotFoundException 上的 Apache Hive 查询
- python - 在 Django 中选中复选框的列表
- azure - 有没有办法在将更改保存到 DevOps GIT 之前查看 Azure 数据工厂中的更改?