zoukankan      html  css  js  c++  java
  • angularJs-脏检查

    来自:http://www.cnblogs.com/liuyanan/p/4935652.html

    scope是一个指向应用model的object,也是表达式的执行上下文。
    scope被放置在一个类似应用的DOM结构的层次结构中

    angular中变量是双向绑定的 ,那么怎么知道一个变量是否是变化了呢?

    1、只能通过固定的接口才能改变变量的值,比如说只能通过set()设置变量的值,set被调用的时候比较一下就知道了。这种方法的缺点是写法比较繁琐。
    2、脏检查,将原对象复制一份快照,在某个时间,比较现在对象与快照的值,如果不一样就表明发生了变化,这个策略要保留两份变量,而且要遍历对象,比较每个属性,这样会有一定的性能问题
     
    angular使用的就是脏检查:
    1、不会脏检查所有的对象。当对象被绑定到html中后,这个对象才会添加为检查对象(watcher)
    2、不会脏检查所有的属性。同样当属性被绑定后,这个属性才会被列为检查的属性
    在angular程序初始化时,会将绑定的对象的属性添加为监听对象(watcher),也就是说一个对象绑定了N个属性,就会添加N个watcher。
    angular什么时候去脏检查呢?angular所有系统的方法中都会触发比较事件,比如:controller初始化的时候,所有以ng-开头的事件被执行后,都会触发脏检查
    必要的时候我们要手动的触发脏检查:$apply仅仅只是进入angular context,然后通过$digest触发脏检查
    $apply如果不给参数的话,会检查该$scope里的所有监听的属性,所以推荐给上参数。
     
    $apply怎么使用:
    复制代码
    <script>
    var firstController=function($scope){
      $scope.date = new Date();
      setInterval(function(){
        $scope.$apply(function(){     $scope.date = new Date();     //在这里去手动触发脏检查
        })   },1000)

    }
    </script>

    <div ng-app>
      <div ng-controller = "firstController">
        {{date}}
      </div>
    </div>
    复制代码

    $apply实现脏检查实际上是通过$digest实现的,但是我们不能直接使用$digest来触发,原因是在$apply 与$digest之间还有一层很重要的$evel判断。如果中间有错误$evel将会把错误交送到$exceptionHandler进行处理

  • 相关阅读:
    Codeforces Round #344 (Div. 2) C. Report 其他
    Codeforces Round #344 (Div. 2) B. Print Check 水题
    Codeforces Round #344 (Div. 2) A. Interview 水题
    8VC Venture Cup 2016
    CDOJ 1280 772002画马尾 每周一题 div1 矩阵快速幂 中二版
    CDOJ 1280 772002画马尾 每周一题 div1 矩阵快速幂
    CDOJ 1279 班委选举 每周一题 div2 暴力
    每周算法讲堂 快速幂
    8VC Venture Cup 2016
    Educational Codeforces Round 9 F. Magic Matrix 最小生成树
  • 原文地址:https://www.cnblogs.com/liujiale/p/6681056.html
Copyright © 2011-2022 走看看