使用setErrors使表单控件无效

时间:2019-04-24 09:25:04

标签: angular angular-reactive-forms reactive-forms

我正在尝试向表单控件(没有任何验证器)添加错误,并期望控件呈现时处于无效状态。但是它被视为有效。我怎么了?

完整示例:https://embed.plnkr.co/aYayRFpBBTEzggL0vkXi/

const name = new FormControl('A Name');
name.setErrors({ 'something': true });
name.markAsTouched();

const street = new FormControl('A Street');

this.formData = new FormGroup({
  name,
  street
});

我的期望是,不仅“街道”无效,而且“名称”也应该无效(因为它具有“ something”错误)...

谢谢!

2 个答案:

答案 0 :(得分:0)

在视图中呈现后,很可能会重置Reactive表单控件的错误。

很可能一旦在视图中添加了输入框,Angular就会检查验证,然后重置您的控件错误,因为它在窗体控件中看不到任何错误(没有设置Validators)。

如果您在ngAfterViewInit()下进行更改,它将可以正常工作。 (但是,是的,那之后您必须调用检测更改,否则将会收到“ expressionChangedAfterItHaHasBeenCheckedError”错误)。

constructor(private _cdr: ChangeDetectorRef) { }

ngOnInit() {
  const name = new FormControl('A Name');

  const street = new FormControl('A Street');

  this.formData = new FormGroup({
    name,
    street
  });
}

ngAfterViewInit() {
    this.formData.get('name').setErrors({'something': true})
    this._cdr.detectChanges();
}

在此处查看示例:https://plnkr.co/edit/RgEoRPF8jSp203xfwiFS?p=preview

答案 1 :(得分:0)

猜猜我找到了一个好的解决方案: https://embed.plnkr.co/kop9jGFR6y5C4SnxXgcL/

您可以只设置“伪”验证器,而不是设置错误:

const name = new FormControl('A Name', {
  validators: () => {
    return { 'something': true };
  }
});

但是我仍然不明白为什么它在最初的方式中不起作用:(