Angular 有没有办法避免设置超时?

Angular 有没有办法避免设置超时?,angular,forms,Angular,Forms,我创建了一个实现ControlValueAccessor的自定义控件,并将该控件放入模板驱动的表单中 这是一个允许为某些活动设置开始和停止日期以进行计划的表单,而过去的开始日期无效。我有一个验证程序,所以当我点击那个控件时,它会显示一个错误。但当用户打开页面时,他/她不会立即看到任何错误,因为用户需要单击该控件以将其设置为焦点状态 我想做一件“简单”的事情——只要在过去的日期自动聚焦控件,就可以得到显示错误的控件。我遇到的问题是,在控件的writeValue()之前调用父组件中的ngAfterV

我创建了一个实现ControlValueAccessor的自定义控件,并将该控件放入模板驱动的表单中

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

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

这不是我第一次遇到这样的问题,因为调用ngAfterViewInit太早了,但是以后没有可控/同步的方法来执行任何操作

有没有办法避免ngAfterViewInit中的setTimeout

下面是一个没有setTimeout的小示例,它显示在ngAfterViewInit之后调用writeValue:


提前谢谢

我认为“简单”的方法是调用
updateValueAndValidity
而不仅仅是关注它。确保在查看选中后调用它

<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);
  }

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

如果您不想在这里的另一个SO问题中解释父控件中的引用,那么还有另一个解决方案:

我认为“简单”的方法是调用
updateValueAndValidity
而不仅仅关注它。确保在查看选中后调用它

<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);
  }

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

如果您不想在另一个SO问题中解释父级中的控件引用,还有另一种解决方案:

您是否尝试过ngAfterViewChecked()?当然。在第一次呼叫期间,问题是相同的。我需要哪个电话?这看起来像是黑客攻击。我添加了一个小的stackblitz示例。您是否尝试过NgaftViewChecked()?当然。在第一次呼叫期间,问题是相同的。我需要哪个电话?这似乎是一个黑客攻击。我添加了一个小的stackblitz示例。
nAfterViewChecked
被多次调用,因此
updateValueAndValidity()
也将以相同的方式被调用。
nAfterViewChecked
被多次调用,因此
updateValueAndValidity()
也将以相同的方式被调用。