AngularJS $watch变量监视

在使用AngulaJS编写应用时,我们经常需要做的一件事情就是对模型中的变量进行监视,并对其发生的变化做出相应的回应。如:购物车小计。

AngularJS为我们提供了一个非常方便的$watch方法,它可以帮助我们在每个scope中监视其中的变量。下面是一个非常简单的例子:

Java代码  

  1. $scope.name = 'zhangsan';  
  2.   
  3. $scope.count = 0;  
  4.   
  5. $scope.cart = [  
  6.     {id:1,name:'iphone5s',quantity:3,price:4300},  
  7.     {id:2,name:'iphone5c',quantity:30,price:3300},  
  8.     {id:3,name:'mac',quantity:3,price:14300},  
  9.     {id:4,name:'ipad',quantity:100,price:2000}  
  10. ];  
  11.   
  12. // 监听一个model 当一个model每次改变时 都会触发第2个函数  
  13. $scope.$watch('name', function(newValue, oldValue) {  
  14.     // console.log(newValue+ '===' +oldValue);  
  15.     ++$scope.count;  
  16.   
  17.     if ($scope.count > 3) {  
  18.         $scope.name = '已将大于3次了';  
  19.     }  
  20. });  
  21.   
  22. $scope.$watch('cart', function(newValue, oldValue) {  
  23.     // console.log(newValue);  
  24.     angular.forEach(newValue, function(item, key) {  
  25.         if(item.quantity < 1) {  
  26.             var returnKey = confirm('是否从购物车内删除该产品');  
  27.             if(returnKey) {  
  28.                 $scope.remove(item.id);  
  29.             }else{  
  30.                 item.quantity = oldValue[key].quantity;  
  31.             }  
  32.             return ;  
  33.         }  
  34.     });  
  35. }, true); ////检查被监控的对象的每个属性是否发生变化  

上面的这段代码非常简单,它用$watch来对$scope中的name进行监视,并在它发生变化的时候将$rootScope中的count属性增加1。因此,每当我们对name进行一次修改时,下面显示的change count数字就会增加1,当count>3时,改变name的值。

在AngularJS内部,每当我们对ng-model绑定的name属性进行一次修改,AngularJS内部的$digest就会运行一次,并在运行结束之后检查我们使用$watch来监视的东西,如果和进行上一次$digest之前相比有了变化,则执行我们在其中绑定的处理函数。

时间: 2024-08-10 09:47:15

AngularJS $watch变量监视的相关文章

Javascript监视变量变化的方法_javascript技巧

本文实例讲述了Javascript监视变量变化的方法.分享给大家供大家参考.具体分析如下: 大家应该知道,在C#中对于属性.文件等的更改监视非常简单,因为有委托(事件).FileSystemWatcher等好东东扶持. 那么在JavaScript中,如何对变量的更改进行监视呢?首先,我仿照c#的属性来对JS进行操作,写出了如下的示例: function Class1() { var oldValue=''; var name='xu'; var id='1'; this.setName=func

深入理解Java内存模型(四) volatile

volatile的特性 当我们声明共享变量为volatile后,对这个变量的读/写将会很特别.理解 volatile特性的一个好方法是:把对volatile变量的单个读/写,看成是使用同一个监视器锁对这些单个 读/写操作做了同步.下面我们通过具体的示例来说明,请看下面的示例代码: class VolatileFeaturesExample { volatile long vl = 0L; //使用volatile声明64位的long型变量 public void set(long l) { vl

可爱的Python:Python IDE测评

David Mertz 介绍了 6 种 Python 集成开发环境,并比较了其特性.平台和稳定性.他发现 -- 或许只是无意中对开放源代码模块的测试 -- 免费产品似乎都比商业产品优秀. 前几周,我有幸对一些 Python 开发环境做了一次全新的试用(或者说是首次尝试).这样很可能会涉及从实际尝试"最佳文本编辑器,附加命令行"方法到 Python 开发,而对于更复杂的 Python 集成开发环境 (IDE) 在 Python 讨论网站上有详尽的内容. 对 Python IDE 的整体印

基于AIR Android应用开发1:环境搭建

基于AIR Android应用开发 --环境搭建 1.  AIR SDK之于Android AIR SDK是一组打包和部署AIR应用程序的工具.它与工具捆绑,所以无需额外的安装.工具负责访问这些文件,不需要有你进行任何管理.AIR SDK有下面这些组件构成. 图0:AIR SDK组件图 n  AIR Develop Tool(ADT) AIR使用Java编写的多用途工具.它需要Java 1.5或更高的版本才能运行,用于为Android设备打包AIR应用程序.它根据指定的目标来创建不同的包: l 

IE8 ajax get不了json

问题描述 //分行functiongetParentTjData(province,$this){$.ajax({url:"ReportData.aspx?action=GetParentTjData&day=7&province="+province+"&type=0&startdate=&enddate=",type:"get",dataType:"JSON",async:false

Android Studio + smalidea进行smail动态调试

本人刚接触Android方面的逆向,这是一篇笔记贴,大牛可忽略0x00 用到的工具 Android Studio smalidea Android killer 一部root过的手机 0x01 反编译APK 将apk拖入Android killer中反编译生成工程目录 0x02 Android Studio 安装smalidea 1. 打开Android Studio ,点击File,选择Settings,或者按快捷键Ctrl+Alt+S打开设置界面,点击Plugin,再点击install pl

websocket+html5开发聊天室。为什么会出现空连接的情况

问题描述 应该不是服务端问题贴客户端代码,js部分.框架应该没问题<head><title>聊天室</title><metacontent="text/html;charset=gbk"http-equiv="Content-Type"><linkrel="stylesheet"type="text/css"href="css/css.css"/>

JavaScrip调试技巧之断点调试_javascript技巧

 首先,在各个浏览器中,断点调试支持的最好的当然是Firefox,Firefox不仅可以使用Firebug调试页面js脚本,还可以用高级调试工具例如JavaScript Debugger (Venkman) 来调试Firefox扩展里的js.除此之外,Firefox还支持一些更为高级的断点调试.变量监视功能. 其他浏览器里,Opera.Chrome和Safari的调试功能也比较好用.Opera的DragonFly速度相对比较快,界面清爽,功能强大,但不如Safari等友好.相比来说,IE8的程序

ajax 发送数据到 ashx 只执行一次的问题!

问题描述 代码只能执行了一次,第二次点击的时候,就没有返回的数据了,求解!刚开始用ajax请各位大神多指点!谢谢了!$("#DataKeep").click(function(){varRowAllData=All_Expense();//返回数据$.ajax({url:'Data_Keep.ashx',//ajax提交路径type:'post',//提交方式data:{Application_Type:$("#Application_Type").val(),Di