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

时间: 2024-10-10 17:58:24

angularJs-脏检查的相关文章

angularjs脏检查机制

很久没有写点东西了,从今天起,在博客园对自己过往的工作,学习和生活做一些梳理,总结和温故.今天窗外的阳光不那么任性,天空白云点点,蝉鸣依旧嘹亮,安静地坐在阳台上,吹着风,敲击着键盘.于我而言,这就是幸福生活. 转入正题,对angularjs脏检查机制做了个回顾和总结如下: 参考文章:  http://teropa.info/build-your-own-angular/ http://www.cnblogs.com/likeFlyingFish/p/6183630.html http://www

angularjs脏检查

angularjs实现了双向绑定,与vue的defineProperty不同,它的原理在于它的脏检查机制,以下做了一些总结: angular.js介绍 AngularJs是mvvm框架,它的组件是vm组件,scope是vm组件的数据集合 AngularJs通过directive来声明vm的行为,它实现为一个watcher,监听scope的属性的变化,把最新的属性更新UI AngularJs的双向绑定:如:一个是将$scope属性值绑定到HTML结构中,当$scope属性值发生变化的时候界面也发生

脏检查

首先解释一下什么是脏检查:在angular中,数据绑定到html中后,这个数据改变了,需要检查刷新,这就触发了脏检查. Angular中的数据是双向绑定的,那么我们怎么知道数据是否是变化了呢? 1.首先能通过固定的接口才能改变变量的值,比如说只能通过set()设置变量的值,set被调用的时候比较一下就知道了.这种方法的缺点是写法比较繁琐. 2.脏检查,将原对象复制一份,在某个时间,比较现在对象与原对象的值,如果不一样就表明发生了变化,这个策略要保留两份变量,而且要遍历对象,比较每个属性,这样会有

$apply方法(触发脏检查机制)

$swatch监听方法 <!DOCTYPE html> <html><head lang="en"> <meta charset="UTF-8"> <title></title> <script src="../angular-1.5.5/angular.min.js"></script> </head> <body ng-app=&

Session脏检查及清理缓存机制

今天看hibernate书,看到"理解Session的缓存"这一张脏检查及清理缓存的机制后,突然明白程序中session并非一定要执行update()方法.没有执行update()方法,对象仍会与数据库进行数据交互. Session脏检查及清理缓存机制: Session缓存中对象的属性每次改变时,Session不会立即清理缓存及执行Update SQL,而是会在特定时间清理缓存(执行相应的sql),提交事务. 清理缓存时,会相应的改变对象的状态. Java对象在内存中有四个状态:临时状

脏检查 和 缓存清理机制

Session到底是如何进行脏检查的呢?当一个Customer对象被加入到Session缓存中时,Session会为Customer对象的值类型的属性复制一份快照.当Session清理缓存时,会先进行脏检查,即比较Customer对象的当前属性与它的快照,来判断Customer对象的属性是否发生了变化,如果发生了变化,就称这个对象是“脏对象”,Session会根据脏对象的最新属性来执行相关的SQL语句,从而同步更新数据库. 缓存清理机制 当Session缓存中对象的属性每次发生了变化,Sessi

8.29 脏检查笔记

个人理解图 脏检查 Session到底是如何进行脏检查的呢?当一个Customer对象被加入到Session缓存中时,Session会为Customer对象的值类型的属性复制一份快照.当Session清理缓存时,会先进行脏检查,即比较Customer对象的当前属性与它的快照,来判断Customer对象的属性是否发生了变化,如果发生了变化,就称这个对象是“脏对象”,Session会根据脏对象的最新属性来执行相关的SQL语句,从而同步更新数据库. 缓存清理机制 当Session缓存中对象的属性每次发

脏检查及刷新缓存机制

当事务提交时,Hibernate会对Session中持久状态的对象进行检测,判断对象的数据是否发生了改变,这种判断称为脏检查 Session session; Transaction tx; @After public void afterTest(){ tx.commit(); HibernateUtil.closeSession(); } @Before public void initDate(){ session=HibernateUtil.getSession(); tx = sess

关于Hibernate脏检查与快照

脏检查 Session到底是如何进行脏检查的呢?当一个Customer对象被加入到Session缓存中时,Session会 为Customer对象的值类型的属性复制一份快照.当Session清理缓存时,会先进行脏检查,即比较Customer对象的当前属性与它的快照,来 判断Customer对象的属性是否发生了变化,如果发生了变化,就称这个对象是“脏对象”,Session会根据脏对象的最新属性来执行相关的SQL语 句,从而同步更新数据库. 缓存清理机制 当Session缓存中对象的属性每次发生了变

Hibernate 中三种状态及脏检查

java对象的三种状态 持久态: Student stu=new Student() Session.save(stu); Session以及数据库都有 游离态: stu.setId(1); Session.close(); Session没有 数据库中有 瞬时态: Student stu=new Student() 体现:在Session中以及DB都没有 三种状态图: 使用new关键字构建对象,该对象的状态是瞬时状态. 1 瞬时状态转为持久状态 使用Session对象的save()或saveO