1.脏检查循环触发时机
angular并不存在定时脏检查。
angular对常用的dom事件,xhq事件作了封装,如果调用这些封装,就会在里面触发进入angular的digest流程,主要有以下情况:
- DOM事件,如用户输入文本,点击按钮等,(ng-click)
- XHQ响应事件($http)
- 浏览器Location变更事件,即Url中hash部分变更($location)
- Timer事件(interval)
- 手动调用digest
2.scope作用域对象
- 在作用域上添加数据本身不会有性能折扣,angular的脏检查循环遍历的是监听器列表,而不是作用域的属性
- digest会调用每一个监控函数,最好关心监听器的数量和监控函数的性能
3.$digest脏检查循环
- 脏检查循环检查出监控数据有变化时会再次运行,直到监控数据没有发生变化为止
- 如果一个监听函数改变另一个监控变量,而另一个监听函数反过来改变这个监控变量,则会造成无限循环,需要给脏检查循环设置一个次数上限
- angular默认不使用基于值的脏检查,因为检查值需要遍历嵌套的数据结构,深拷贝的数据也很占用内存