Angular change detection

Angular change detection

angular源码基于zone.js进行变更检测,拥有NgZone,在ApplicationRef的构造函数中监听zone.js的onTurnDone事件,回调函数中遍历整个angular应用中每个组件的changeDetector的detectChanges。

class ApplicationRef {

  changeDetectorRefs:ChangeDetectorRef[] = [];

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

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

onTurnDone事件的激活可以来自:用户的操作事件(按钮点击、表单提交等)、XHR、定时器(setTimeout、setInterval)

angular工程逻辑上映射为组件树,组件树对应有changeDetector树、数据模型树。

ChangeDetectionStrategy包含Default(默认值)、OnPush两种变更检测策略;
只有当引用发生变化才会继续进行视图更新(不可变对象、Observable);
OnPush时,@Input属性引用变化会触发本组件的变更检测,但需要调用本组件changeDetector的markForCheck来进行根节点到当前组件节点的完整检测。
changeDetector还提供了detectChanges(常用)、detach、reattach、checkNoChanges方法。

参考文献1 Angular Change Detection Explained

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值