美文网首页Web前端之路让前端飞Web 前端开发
自制前端框架Day23.Scope的parses与evalAsy

自制前端框架Day23.Scope的parses与evalAsy

作者: 蚊子爸爸 | 来源:发表于2017-07-04 11:56 被阅读46次

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吗?所以我想想怎样会触发这种情况。
想到了:看一下代码:

image.png

很明显,我是手动调用了digest,才会执行第一次digest,那么如果我不调用这个digest,我直接运行evalAsync的话,就会出现刚才说的情况。
为了解决这个问题,应该给evalAsync增加一些机制:当调用evalAsync的时候,会检查一下现在的scopeParses,如果是闲着的,并且队列里有任务,就调用一次$digest。

image.png

相关文章

网友评论

    本文标题:自制前端框架Day23.Scope的parses与evalAsy

    本文链接:https://www.haomeiwen.com/subject/kepthxtx.html