角度2变化检测机制

时间:2016-07-20 08:39:46

标签: javascript angular

我正在研究Angular 2变化检测,我遇到了一些麻烦,或者至少我需要一些解释。

让我们从AppRef(以及来自Througtram博客)获得以下简化代码:

class ApplicationRef {

  changeDetectorRefs:ChangeDetectorRef[] = [];

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

  tick() {
    this.changeDetectorRefs
      .forEach((detector) => detector.detectChanges());
  }
}

我们可以假设组件中有一个changeDetector。 我也假设在一个有角度的2应用程序中只使用了一个Zone.js fork。

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

detectChanges(){
  //...
 if(this.previousValue !== newValue){
   this.previousValue = newValue
 }

}

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

感谢您的帮助

1 个答案:

答案 0 :(得分:2)

基本上是的,Angular在每个变化检测周期中从上到下比较每个绑定。

这就是为什么$lastactivity = Activity::where('text','LIKE','%Affiliate ['.$data->affiliate_name.']%')->get(); 允许在没有为此组件更改输入属性时跳过检查组件(及其子/后代组件和指令)的原因。