Angular-变更检测

1、angular如何以及何时根据数据模型更新html

答:angular使用zone.js来进行变更检测,zone是一个跨异步任务持久化存在的执行上下文,同时angular提供了NgZone服务类,来在组件中使用zone的能力

a、执行时机:会在angular组件初始化、触发DOM事件、数据请求、宏任务、微任务、其他异步操作(websocket.onmessage\canvas.toBlob)时进行数据的变更检测

b、获取上下文以及生命周期:可以通过Zone.current来获取当前的上下文,可以通过Zone.current.fork()方法配置对应的生命周期钩子

c、手动触发变更检测:ngZone.run()方法的回调中执行一些异步函数,并在方法执行后的合适时间触发变更检测

d、手动指定不触发变更检测:ngZone.runOutSideAngular()方法的回调中添加一些不需要触发变更检测的函数

2、猴子补丁

答:在运行时添加或修改函数的默认行为,并且不会更改源代码的技术,而zone.js对DOM事件、HTTP请求、宏任务、微任务以及其他异步任务进行了包装,在监听到事件时会触发angular的tick()方法,并在tick()方法内部调用detectChange()方法实现变更检测

3、配置zone.js不需要监听的事件或者操作

答:定义zone-flags.ts文件,并在polyfills.ts文件中import 'zone.js';语句之前导入,zone-flags.ts文件内容定义方式如:

(window as any).__Zone_disable_requestAnimationFame = false; // 过滤需要监听的任务

(window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // 过滤需要监听的DOM事件

注意:配置文档:https://github.com/angular/angular/blob/master/packages/zone.js/MODULE.md