Angular:setErrors在循环内不起作用

时间:2017-10-08 08:07:28

标签: angular angular2-forms angular2-formbuilder

我有一个FormArray我想要立即验证的字段。我正在迭代FormArray并为每个元素(FormGroup),我检查一个条件,禁用有效的FormGroup以避免用户更改它将错误设置为FormControl内的特定FormGroup

以下是我的代码。 rowsFormArray

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包裹它并且有效。

1 个答案:

答案 0 :(得分:2)

这是因为您在OnInit挂钩内设置了验证器。当Angular将控件放在视图中时,它会重新运行验证器,从而消除您设置的错误。

这是使用AfterViewInit挂钩解决此问题的a demo。代码也包含在setTimeout调用中,以避免ExpressionChangedAfterChecked错误。

我个人不同意这种行为,并且有一个open issue,所以你跟踪它。