Angular2如何实时监控变化?

先了解一个这样的问题,Javascript在整个运行时都可以被重写
1.覆盖浏览器的默认机制
Angular2启动的时候会对浏览器API打低级补丁,例如AddEventListener(),会覆盖原有的方法,对原有方法进行扩展
这样才有机会进行更改检测,并做相关处理,对于浏览器的低级API补丁,Angular2采用Zonejs来完成,这是一种通用
的机制,我们可以为浏览器添加额外的功能,Angular2内部使用Zone来触发更改机制,还有一种可能是执行应用程序
分析,或跟踪多个虚拟机的堆栈信息进行跟踪
    ZoneJS对浏览器所有基础事件进行了补丁,timeOut,interval,Ajax,click,hover等等,但是它是有限制的,因为zonejs不
支持异步浏览器API,例如indexDB的回调,这样就解释了为什么他的变化会被检测到
2.检测机制触发后是如何工作
Angular2启动的时候,每一个组件都有一个关联的更改检测器
1.缺省的变更机制
    对于模板中使用的表达式,现有值与原来的值进行比较,默认情况的检查不会做深度对比,仅仅会对使用的属性进行对比
2.changeDetection.OnPush && Immutable.js类似库
    此种情况下引用的变更才会触发,而属性的改变不会触发,这样的检查显然是不靠谱的,所以引入了Immutable.js,来确保
对象的不可变性,同时Angular2采用的是单向的数据流,这样就避免了angular1的双向绑定那个三重的for循环,进而提升了
性能,Angular2的dev和生产模式下也是不同的,对于检查,在生产环境只会检查一次
3.是否可以手动关闭脏值检查,比如1秒触发一次脏值检查
1
2
3
4
 constructor(private ref:ChangeDetectorRef){
ref.detach();
setInterval(()=>{this.ref.detectChanges();},1000)
}
4.结论
Angular2和angular1的默认检查还是有很大不同的,做了一些优化,而且在Angular2中,变化检测是可以选择的