Javascript 角2变化检测机构
我正在研究角度2变化检测,我遇到了一些问题,或者至少,我需要一些解释 让我们从AppRef(和Throughtram博客)获得以下简化代码: 我们可以假设每个组件都有一个changeDetector。 我还假设一个angular 2应用程序中只使用了一个Zone.js fork 从现在开始,让我们了解detectChanges的代码实现,其中有一个比较,例如(简化): 从那时起,知道只有一个Zone.js fork将触发所有事件,然后开始一个changeDetection循环,这是否意味着所有组件树中的所有检测器都将被此比较所关注?我的意思是,如果我有1000个组件,我会有1000个调用来检测更改吗Javascript 角2变化检测机构,javascript,angular,Javascript,Angular,我正在研究角度2变化检测,我遇到了一些问题,或者至少,我需要一些解释 让我们从AppRef(和Throughtram博客)获得以下简化代码: 我们可以假设每个组件都有一个changeDetector。 我还假设一个angular 2应用程序中只使用了一个Zone.js fork 从现在开始,让我们了解detectChanges的代码实现,其中有一个比较,例如(简化): 从那时起,知道只有一个Zone.js fork将触发所有事件,然后开始一个changeDetection循环,这是否意味着所有组
感谢您的帮助基本上是的,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
}
}