Parses是啥
之前在写表达式的时候遇到的parse是解析的意思,这里的parses是阶段的意思。scope上面有一个标志位,可以标记出现在的阶段,比如正在digest,等等,比如用angular的人都经常见到这样的错误 Error: $digest already in progress
。
思路
在scope内部设置一个属性用来标记状态:
image.png同时要设计两个相应方法,一个用来设置parses,一个用来清除parses:
Scope.prototype.$beginParse=function (parses) {
if(this.$$parses){
throw parses+"is already in progress";
}
this.$$parses = parses
}
Scope.prototype.$clearParse=function(){
this.$$parses = null;
}
接下来就是要在相应的时候来设置状态了。这一段就不写出来了,因为没什么意思。
evalAsync的另一种状况
在angular中,evalAsync方法还有一个功能就是自动调用一次digest。虽然我不知道为什么要这样做,但是大概是这个意思:如果evalAsync推入一个延迟执行的函数到队列中,可是这时候scope已经是干净的了,于是就不会执行下一次digest,于是推入的函数就不会执行。
可是,之前不是在检查脏值的时候也检查了queue.length吗?所以我想想怎样会触发这种情况。
想到了:看一下代码:
很明显,我是手动调用了digest,才会执行第一次digest,那么如果我不调用这个digest,我直接运行evalAsync的话,就会出现刚才说的情况。
为了解决这个问题,应该给evalAsync增加一些机制:当调用evalAsync的时候,会检查一下现在的scopeParses,如果是闲着的,并且队列里有任务,就调用一次$digest。
网友评论