我有一个FormArray
我想要立即验证的字段。我正在迭代FormArray
并为每个元素(FormGroup
),我检查一个条件,禁用有效的FormGroup
以避免用户更改它将错误设置为FormControl
内的特定FormGroup
。
以下是我的代码。 rows
是FormArray
。
response.forEach((item, index) => {
if (item.detailName.valid && item.detailNo.valid)
(<FormArray>this.detailForm.get('rows')).at(index).disable({
onlySelf: true
});
else if (!(item.detailName.valid && item.detailNo.valid))
if (!!item.detailName.value && !item.detailNo.value)
this.detailForm.get(['rows', index, 'detailName']).setErrors({
'invalidValue': true
});
else
this.detailForm.get(['rows', index, 'detailNo']).setErrors({
'invalidValue': true
});
});
错误未按预期设置。如果我VALID
,该控件将显示为console.log
。
更新:用setTimeout
包裹它并且有效。
答案 0 :(得分:2)
这是因为您在OnInit
挂钩内设置了验证器。当Angular将控件放在视图中时,它会重新运行验证器,从而消除您设置的错误。
这是使用AfterViewInit
挂钩解决此问题的a demo。代码也包含在setTimeout
调用中,以避免ExpressionChangedAfterChecked
错误。
我个人不同意这种行为,并且有一个open issue,所以你跟踪它。