【问题标题】:Is there a way to avoid setTimeout?有没有办法避免setTimeout?
【发布时间】:2019-09-07 12:16:07
【问题描述】:

我创建了一个自定义控件,它实现了 ControlValueAccessor 并将该控件放入模板驱动的角度形式。

这是一种允许为某些活动设置开始和停止日期以计划它的表单,并且过去的开始日期无效。我有一个验证器,所以当我点击那个控件时它会显示一个错误。但是当用户打开一个页面时,他/她不会立即看到任何错误,因为用户需要单击该控件才能将其设置为聚焦状态。

我想做“简单”的事情 - 只是在过去日期时自动聚焦控件以使该控件显示错误。我遇到的问题是父组件中的ngAfterViewInit在控件中的writeValue()之前被调用。所以我可以设置焦点,但没有显示任何错误。如果我手动点击另一个字段广告然后返回 - 我看到错误。这个问题可以通过包装我的代码来解决,用于在一个函数中设置聚焦状态并以零间隔传递给 setTimeout。

ngAfterViewInit 被过早调用但没有可控/同步的方式在以后进行任何操作时,这不是我第一次遇到这样的问题。

有什么办法可以避免ngAfterViewInit中的setTimeout?

这是一个没有 setTimeout 的小例子,它表明 writeValuengAfterViewInit 之后被调用:https://stackblitz.com/edit/angular-ngafterviewinit-quirks

提前致谢!

【问题讨论】:

  • 你试过 ngAfterViewChecked() 吗?
  • 当然。第一次通话时问题相同。我需要哪个电话?这似乎是一个 hack。
  • 我添加了一个小的 stackblitz 示例。

标签: angular forms


【解决方案1】:

我认为“简单”的事情是调用updateValueAndValidity 而不仅仅是关注它。一定要打电话给ngAfterViewChecked

<custom-control name="custom" [(ngModel)]="model.custom" minlength="100"></custom-control>

ngAfterViewChecked(): void {
    this.formRef.form.controls['custom'].updateValueAndValidity();
    console.log(this.formRef.form.controls['custom'].valid);
  }

如果您不想在另一个 SO 问题中解释此处对父控件的引用,还有另一种解决方案:setValidators in custom control without from reference in Angular

【讨论】:

  • ngAfterViewChecked 被多次调用,所以updateValueAndValidity() 也会以同样的方式被调用。
猜你喜欢
  • 1970-01-01
  • 2019-05-29
  • 2011-09-13
  • 2021-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-02
相关资源
最近更新 更多