有办法避免setTimeout吗?

时间:2019-04-17 09:30:40

标签: angular forms

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

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

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

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

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

这是一个没有setTimeout的小例子,它显示在 ngAfterViewInit 之后调用 writeValue https://stackblitz.com/edit/angular-ngafterviewinit-quirks

谢谢!

1 个答案:

答案 0 :(得分:0)

我认为“简单”的事情是打电话给switch (process.env.APP_ENV) { case 'dev': env_suffix = ".dev"; break; case 'stage': env_suffix = ".stage"; break; case 'local': env_suffix = ".local"; break; } require("dotenv").config({ path: path.join(__dirname + "/../", ".env" + env_suffix) }); 而不仅仅是关注它。请务必在process.env

中调用它
updateValueAndValidity

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