angularjs $evalAsync()实现原理
来源:互联网 发布:直播源码下载 编辑:程序博客网 时间:2024/05/21 19:31
《angularjs权威教程》是怎么说的
- angular扩展了 addEventListener的流程
- angular事件循环通常称为$digest循环
$digest循环分两步:$watch列表,$evalAsync列表
- 一个用作ui的$scope属性,向$watch列表增加一个函数
- $watch列表会在$digest循环中被“脏值检查”解析
- 脏值检查维护一个旧值一个新值一个isDirty就好
- $scope.$watch( expression , callback )用于给$digest循环手动装配一个脏值检测,如果expression的值检测到变化,则多$digest循环一次
- $scope.$watch()的返回是它本身的注销函数
ng-click后,会绑定onclick时间,调用$scope.$apply(),从而再次进入$digest循环
$digest循环运行的第二个操作是执行$$asyncQueue。可以使用$evalAsync()方法访问这个工作队列??这什么意思??
- 脏值检查完毕后,asyncQueue队列是空的,所以我们在脏值检测阶段通过$evalAsync()把函数加到队列里,然后执行异步列表,然后再来一轮$digest循环
- $apply()让你从angular框架外部搞一个函数到angular上下文里面去执行,$apply随后还会调用$digest循环。所有ng-[event]指令都会调用$apply()!!!
源代码是怎么写的
看源码痛苦了好几天,找不到切入口。经人建议,从$scope.$apply看起。
$apply()
Scope.prototype = { $apply: function(expr){ try { beginPhase('$apply'); return this.$eval(expr); } finally { clearPhase(); try { $rootScope.$digest(); } } }}function beginPhase(phase) { $scope.$$phase = phase;}
可以看出,$apply()基本上除了调用$digest()啥都没做
/********* $digest() line 15039 *******/do { dirty = false; current = target; // while(asyncQueue.length) { try { asyncTask = asyncQueue.shift(); asyncTask.scope.$eval(asyncTask.expression, asyncTask.locals); //如何用$evalAsync()访问这个队列? } do { if((watchers = current.$$watchers)) { length = watchers.length; while( length-- ) { watch = watchers[length]; if(watch) { if((value=watch.get(current)) !== (last=watch.last) && !(watch.eq ? equals(value,last): (typeof value==='number' && typeof last==='number' && isNaN(value) && isNaN(last) ))) { dirty = true; lastDirtyWatch = watch; watch.last = watch.eq?copy(value,null) : value; watch.fn(value,((last===initWatchVal)) } } } } while ((current=next)) } }
compile
/*--------- line 6098 ---------*/
0 0
- angularjs $evalAsync()实现原理
- The differences between AngularJS $apply, $digest, and $evalAsync
- AngularJS实现原理
- [AngularJS面面观] 5. scope中的两个异步方法 - $applyAsync以及$evalAsync
- angularjs +boostrap后台模板实现原理
- $scope.$evalAsync() 和 $timeout()
- 深入了解Angularjs指令中的 [(ngModel)]的实现原理
- Angular单页应用&AngularJS内部实现原理
- angularjs实现
- angularjs实现
- angularjs实现
- AngularJs数据绑定原理
- 揭秘AngularJS工作原理
- AngularJs数据绑定原理
- AngularJS 指令编译原理
- AngularJS 工作原理详解
- 揭秘AngularJS工作原理
- AngularJs数据绑定原理
- Storm 是如何跟踪一条消息以及它衍生出来的消息都被成功处理的
- 第六章 应用层(网络)--基于Linux3.10
- org.json.JSONObject的optXXX方法
- 6.3 在Spring中的编码事务
- Gift Exchanging - UVa 10417 概率dp
- angularjs $evalAsync()实现原理
- 函数的声明和定义
- 标准C语言头文件
- IO包中的其他类
- vim配置文件
- 解决WindowsForm窗体假死的状态
- UGNX多个实体(组件)随机改变颜色GRIP代码
- 消息队列 RabbitMQ系列 第四篇:发布/订阅 Publish/Subscribe
- ios xmpp研究探索:接收消息