ngDoCheck的实际用例(Angular9)

时间:2020-04-02 09:55:47

标签: angular use-case angular9 angular-lifecycle-hooks angular-component-life-cycle

我是Angular的初学者,我自己学习,并且坚持使用 ngDoCheck生命周期方法

根据文档
检测到Angular自己无法或不会自己检测到的更改并对其采取行动。

父组件:

user={
   name:"xxx"
}

update(){
  this.user.name="yyy"
}

父视图:

<button (click)="update">update</button>
<child-comp [inputprop]="user"></child-comp>

子组件

ngDoCheck(){
console.log(this.inputprop);
}

据我所知,使用这种生命周期方法来获得更深层次的最新变化,即ngOnChanges无法检测到更深层次的输入属性变化。

用简单的话来说,ngOnChanges将仅检测到对属性的引用而检测到属性更改。

在上面的示例中,ngDocheck生命周期方法没有做任何事情来获取属性的最新更改。但是,更改检测可以帮助您更深入地获取最新更改

我想知道使用ngDoCheck生命周期方法的确切用例。

1 个答案:

答案 0 :(得分:0)

您的子组件更改检测器可能具有以下策略

  1. 默认
  2. onPush

在默认策略中,CD会运行@Input()装饰的属性中的任何更改

在onPush策略中,将新对象(引用)传递给@Input装饰的属性时,CD会运行。

不管采取何种策略,CD始终在以下情况下运行

  1. 点击,提交等事件被触发
  2. XHR调用以使用API​​
  3. 执行诸如assetTimeOut()或setInterval()之类的异步JavaScript函数

请记住,Angular CD可以可视化为有向树,这意味着所有组件都可以视为树中的一个节点,并且Angular始终从根节点到树的底部运行CD。

Anguular Componnet Tree

即使CC-121中触发了一个事件,Angular也会从根组件到底部运行CD。但是,CD的运行将在将策略设置为onPush的节点处停止,并且不会在@Input装饰的属性之一中传递新对象。

因此,现在您对CD的运行时间和方式有所了解,每次为组件运行CD时,就会执行ngDoCheck()生命周期。

我希望它会有所帮助。

谢谢