是否有一个生命周期挂钩在组件初始化之后运行一次,但在加载双向绑定之后又运行一次?

时间:2019-06-21 22:51:28

标签: angular angular-lifecycle-hooks

初始化组件后,我试图在输入字段中选择一些文本。我知道我可以用http://my-remote-server.com:8000来做到这一点,但是感觉有点太过分了。

大多数钩子会在双向绑定加载输入文本之前运行。每次有人选择其他字段时,其他字段也会运行。

代码:https://stackblitz.com/edit/angular-pxrssq

setTimeout()

是否有一个生命周期挂钩在组件初始化之后运行一次,但是在双向绑定加载之后?

1 个答案:

答案 0 :(得分:0)

事实上,使用setTimeout()并不是解决方案,而是 解决方案。因为angular's unidirectional data flow rule

  

Angular的单向数据流规则禁止在视图组成后对其进行更新。

为了观察此规则的结果,请尝试为info钩子上的ChildComponent的{​​{1}}属性分配一个新值。您将得到一个AfterViewInit,它是Angle所说的“禁止在合成后更新视图!”

由于您没有更新组件的任何数据绑定属性,而只是进行dom操作,所以angular不会抛出任何错误,但也不会反映对dom的更改。

回到您的问题;

  

是否有一个生命周期挂钩在组件初始化之后运行一次,但是在双向绑定加载之后?

是的,它是AfterViewInit钩子。因为;

  

视图查询是在调用ngAfterViewInit回调之前设置的。

,如here中所述,在调用ExpressionChangedAfterItHasBeenCheckedError之前处理DOM更新。

出现after OnChanges钩子,在哪里;

  

当指令的任何数据绑定属性发生更改时,将调用OnChanges。

因此,如果希望在第一次加载组件时只选择一次文本,则应该执行以下操作。

ngAfterViewInit

如果要在父组件更改ngAfterViewInit() { setTimeout(() => this.input.nativeElement.select()); } 属性(包括首次加载)时选择文本,则需要实现input钩子。

OnChanges

这是一个有效的演示https://stackblitz.com/edit/angular-owahps

希望有帮助。