Javascript 角2变化检测机构

Javascript 角2变化检测机构,javascript,angular,Javascript,Angular,我正在研究角度2变化检测,我遇到了一些问题,或者至少,我需要一些解释 让我们从AppRef(和Throughtram博客)获得以下简化代码: 我们可以假设每个组件都有一个changeDetector。 我还假设一个angular 2应用程序中只使用了一个Zone.js fork 从现在开始,让我们了解detectChanges的代码实现,其中有一个比较,例如(简化): 从那时起,知道只有一个Zone.js fork将触发所有事件,然后开始一个changeDetection循环,这是否意味着所有组

我正在研究角度2变化检测,我遇到了一些问题,或者至少,我需要一些解释

让我们从AppRef(和Throughtram博客)获得以下简化代码:

我们可以假设每个组件都有一个changeDetector。 我还假设一个angular 2应用程序中只使用了一个Zone.js fork

从现在开始,让我们了解detectChanges的代码实现,其中有一个比较,例如(简化):

从那时起,知道只有一个Zone.js fork将触发所有事件,然后开始一个changeDetection循环,这是否意味着所有组件树中的所有检测器都将被此比较所关注?我的意思是,如果我有1000个组件,我会有1000个调用来检测更改吗


感谢您的帮助

基本上是的,Angular会在每个更改检测周期中从上到下比较每个绑定


这就是为什么有
ChangeDetectionStrategy.OnPush
,它允许在没有更改此组件的输入属性时跳过检查组件(及其子/子组件和指令)。

最后一件事,以前的状态存储在哪里以供比较?我猜在一个变更检测周期之后,会有一个比较,必须说明变更检测是否适用。你知道它在源代码中的位置吗?对不起,我还没发现。有时使用的不同,如
ngochanges
/
ngDoCheck
中使用的不同,如
ngFor
中使用的不同,但对于组件属性,我不知道。我猜组件中的某些位置。
class ApplicationRef {

  changeDetectorRefs:ChangeDetectorRef[] = [];

  constructor(private zone: NgZone) {
    this.zone.onTurnDone
      .subscribe(() => this.zone.run(() => this.tick());
  }

  tick() {
    this.changeDetectorRefs
      .forEach((detector) => detector.detectChanges());
  }
}
detectChanges(){
  //...
 if(this.previousValue !== newValue){
   this.previousValue = newValue
 }

}