• 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进行处理

  • 相关阅读:
    ural 1723 Sandro's Book
    ural 1104 Don’t Ask Woman about Her Age
    ural 1052 Rabbit Hunt
    ural 1837 Isenbaev's Number
    ural 1348 Goat in the Garden 2
    ural 1207 Median on the Plane
    ural 1640 Circle of Winter
    段错误 核心已转储尝试解决
    显卡相关命令介绍【转载】
    Linux的top命令学习【转载】
  • 原文地址:https://www.cnblogs.com/liujiale/p/6681056.html
Copyright © 2020-2023  润新知