【问题标题】:Change detection not run when the errors are set on reactive forms在反应式表单上设置错误时不会运行更改检测
【发布时间】:2019-03-26 13:00:06
【问题描述】:

我在 Angular 7 上,我正在为我的一种形式使用反应形式,代码如下。 (StackblitzHere)

模板

 <form [formGroup]="SignupForm" *ngIf="SignupForm">
   <input type="text" class="form-control" id="username" formControlName = "username">
   <div *ngIf="SignupForm.errors?.errors">Error</div>
 </form>

打字稿

export class AppComponent implements OnInit {
  SignupForm: FormGroup;

  constructor() {

  }

  ngOnInit() {
    setTimeout(() => {
      this.SignupForm = new FormGroup({
        'username': new FormControl('Value'),
        'email': new FormControl()
      });
      this.SignupForm.setErrors({errors: 'Error'});
    })
  }
}

如您所见,我试图在表单初始化后立即设置错误(在我的实际情况下,我会根据后端数据进行一些验证,然后执行此操作。)。但即使 SignupForm.errors 设置了错误对象,错误似乎也没有出现。

但如果我这样做了

setTimeout(() => { this.SignupForm.setErrors({errors: 'Error'});}) 

一切正常。我做错了什么还是我可以报告的角度错误。请帮忙。谢谢。

注意

实际上,我的表单来自异步的后端。在我从元数据创建表单后,我进行验证并设置错误。所以移动到任何生命周期钩子都不会改变我认为的任何行为。

【问题讨论】:

  • 我感觉错误消息没有显示,因为您的表单是原始的。您是否尝试将表单或单个控件标记为“脏”和“已触摸”?如果我记得你需要调用的方法是 markAsDirty 和 markAsTouched
  • 但它似乎在 setTimeout 之后工作。如果控制是原始的是问题,它也不应该那样工作,对吗?如果我遗漏了什么,请纠正我。
  • 确实如此,您是否尝试过将代码移至 ngAfterViewInit 挂钩?
  • ngAfterViewInit 会起作用。 &lt;div [hidden]="SignupForm.errors?.errors"&gt;Error&lt;/div&gt; 也可以使用
  • 实际上我的表单来自异步的后端。在我从元数据创建表单后,我进行验证并设置错误。所以移动到任何生命周期钩子都不会改变我认为的任何行为。

标签: angular angular7 angular-reactive-forms


【解决方案1】:

请您在 ngAfterViewInit

上写 setErrors

这是一个例子 TS

export class AppComponent implements OnInit {
SignupForm: FormGroup;

constructor() {
}

ngOnInit() {
   this.SignupForm = new FormGroup({
     'username': new FormControl('Value'),
    'email': new FormControl()
  });
}

ngAfterViewInit(){
     this.SignupForm.setErrors({errors: 'Error'});
}

让我知道它是否有效。

【讨论】:

  • 实际上我的表单来自异步的后端。在我从元数据创建表单后,我进行验证并设置错误。所以移动到任何生命周期钩子都不会改变我认为的任何行为。
  • 所以您正在根据 api 的响应创建一个表单,对吗?如果是,您可以尝试在 ngAfterViewInit 中调用 api 并在那里初始化 Formgroup 和错误。
  • 是的。如果我们调用 ngAfterViewInit,也会出现同样的问题。我认为它与生命周期无关,因为事情是异步发生的。可以肯定的是,在我的实际环境中,它已经在 ngAfterViewInit 中,并且同样的问题仍然存在。
猜你喜欢
  • 1970-01-01
  • 2021-05-16
  • 2019-05-07
  • 1970-01-01
  • 1970-01-01
  • 2022-06-24
  • 2020-11-19
  • 2019-11-29
  • 2019-05-02
相关资源
最近更新 更多