美文网首页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