来自: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进行处理

angularJs-脏检查的更多相关文章

  1. 手写AngularJS脏检查机制

    什么是脏检查 View -> Model 浏览器提供有User Event触发事件的API,例如,click,change等 Model -> View 浏览器没有数据监测API. Ang ...

  2. angularjs脏检查

    angularjs实现了双向绑定,与vue的defineProperty不同,它的原理在于它的脏检查机制,以下做了一些总结: angular.js介绍 AngularJs是mvvm框架,它的组件是vm ...

  3. AngularJS 脏检查深入分析

    写在开头 关于Angular脏检查,之前没有仔细学习,只是旁听道说,Angular 会定时的进行周期性数据检查,将前台和后台数据进行比较,所以非常损耗性能. 这是大错而特错的.我甚至在新浪前端面试的时 ...

  4. AngularJS 脏检查机制

    脏检查是AngularJS的核心机制之一,它是实现双向绑定.MVVM模式的重要基础. 一.digest循环 AngularJS将双向绑定转换为一个堆watch表达式,然后递归检查这些watch表达式的 ...

  5. Angularjs 脏值检测

    文章转自:http://www.ituring.com.cn/article/39865 构建自己的AngularJS,第一部分:Scope和Digest 原文链接:http://teropa.inf ...

  6. Hibernate延迟加载、三种状态、脏检查 缓存

    一.持久化对象的唯一标识 java中按内存地址不同区分同一个类的不同对象,关系数据库用主键区分同一条记录,Hibernate使用OID来建立内存中的对象和数据库中记录的对应关系 什么是OID? 解析: ...

  7. 脏检查and刷新机构

    ---恢复内容开始--- 脏检查:当食物提交时,Hiberante会对Session中持久状态的对象进行加测,判断对象的数据是否发生了变化 为什么要进行脏检查?, 解析:如果对象发生了改变,就需要将改 ...

  8. Angular:手动脏检查/$apply/$digest和监控对象/$watch

    声明:借鉴好多chm资料.视频.PDF总结如下: 一.$apply的引入 View <div ng-app=""> <div ng-controller=&quo ...

  9. OID,主键生成策略,PO VO DTO,get和load区别,脏检查,快照,java对象的三种状态

    主键生成策略 sequence 数据库端 native 数据库端 uuid  程序端 自动赋值 生成的是一个32位的16进制数  实体类需把ID改成String 类型 assigned  程序端 需手 ...

  10. 关于Hibernate脏检查与快照

    脏检查 Session到底是如何进行脏检查的呢?当一个Customer对象被加入到Session缓存中时,Session会 为Customer对象的值类型的属性复制一份快照.当Session清理缓存时 ...

随机推荐

  1. 用log4j将日志写入数据库

    以下为log4j中的配置参数: %m 输出代码中指定的消息 %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL %r 输出自应用启动到输出该log信息耗费的毫秒数 %t 输出产 ...

  2. CentOS6.5+nginx+mysql+php(laravel)服务器环境搭建

    公司准备迭代会员中心项目,要上laravel框架,替代以前的Ecshop框架,PHP工程师将部分功能页面代码提交,自己也准备着手搭建一个测试环境将项目跑起来: 一. 环境依赖安装设置 关闭防火墙 [r ...

  3. 【转】社区O2O的增量与存量,机会在哪?

    在[O2凹凸社]的前一篇<社区O2O创业百态:三教九流>中总结过目前社区O2O行业的创业氛围,那更进一步看为何有这么多创业者想进入社区O2O市场呢?社区O2O的吸引力在哪?机会又在哪? 一 ...

  4. pycharm Tab键设置成4个空格

    file--->setting,选择Editor--->python,如下图所示:

  5. imx6 18bit display

    imx6 kernel中使用18bit的lcd,uboot中bootargs参数bpp=32,lcd才能够正常显示. "bootargs=console=ttymxc0,115200 ini ...

  6. MyBatis 本是apache的一个开源项目iBatis

    MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis .20 ...

  7. 遍历一个Set的方法只有一个:迭代器(interator)

    Set-HashSet实现类: 遍历一个Set的方法只有一个:迭代器(interator). HashSet中元素是无序的(这个无序指的是数据的添加顺序和后来的排列顺序不同),而且元素不可重复. 在O ...

  8. 关于 AfxSocketInit()

    一般来说 WASAtarup() 是应用程序调用的Windows Sockets dll的第一个函数,在调用任何Winsock Api之前,必须调用WSAStartup()进行初始化,最后调用WSAC ...

  9. Android笔记——Activity中的回传数据案例(装备选择)

    1.创建程序: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns: ...

  10. JQuery------实现点击左右按钮,切换图片功能

    如图: 代码: html @*商品主图片*@ <div class="product-img" style="display:table-cell;width:40 ...