使用$watch监控数据模型的变化

在scope 内置的全部函数中,用得最多的可能就是$watch 函数了。当你的数据模型中某一部分发生变化时,$watch 函数能够向你发出通知。你能够监控单个对象的属性。也能够监控须要经过计算的结果(函数),实际上仅仅要能够被当作属性訪问到,或者能够当作一个JavaScript 函数被计算出来,就能够被$watch 函数监控。它的函数签名为

  1. $watch(watchFn, watchAction, deepWatch)

当中每一个參数的具体含义例如以下。

watchFn

该參数是一个带有Angular 表达式或者函数的字符串,它会返回被监控的数据模型的当前值。这个表达式将会被运行非常多次。所以你要保证它不会产生其它副作用。也就是说,要保证它能够被调用非常多次而不会改变状态。基于相同的原因。监控表达式应该非常easy被计算出来。假设你使用字符串传递了一个Angular 表达式,那么它将会针对调用它的那个作用域中的对象而运行。

watchAction

这是一个函数或者表达式,当watchFn 发生变化时会被调用。假设是函数的形式,它将会接收到watchFn 的新旧两个值,以及作用域对象的引用。其函数签名为function(newValue, oldValue, scope)。

deepWatch

假设设置为true,这个可选的布尔型參数将会命令Angular 去检查被监控对象的每一个属性是否发生了变化。假设你想要监控数组中的元素。或者对象上的全部属性,而不仅仅是监控一个简单的值,你就能够使用这个參数。因为Angular 须要遍历数组或者对象。假设集合比較大,那么运算负担就会比較重。

$watch 函数会返回一个函数。当你不再须要接收变更通知时,能够用这个返回的函数注销监控器。

假设我们须要监控一个属性。然后接着注销监控。我们能够使用下面代码:

  1. ...
  2. var dereg = $scope.$watch('someModel.someProperty', callbackOnChange());
  3. dereg();

我们再回到第1 章的购物车案例。把它的功能扩充完整。

比如。当用户加入到购物车中的商品价值超过100 美元的时候,我们会给他10 美元的折扣。我们将会使用以下这样的模板:

  1. <div ng-controller="CartController">
  2. <div ng-repeat="item in items">
  3. <span>{{item.title}}</span>
  4. <input ng-model="item.quantity">
  5. <span>{{item.price | currency}}</span>
  6. <span>{{item.price * item.quantity | currency}}</span>
  7. </div>
  8. <div>Total: {{totalCart() | currency}}</div>
  9. <div>Discount: {{bill.discount | currency}}</div>
  10. <div>Subtotal: {{subtotal() | currency}}</div>
  11. </div>

而CartController 看起来可能像以下这样:

  1. function CartController($scope) {
  2. $scope.bill = {};
  3. $scope.items = [
  4. {title: 'Paint pots', quantity: 8, price: 3.95},
  5. {title: 'Polka dots', quantity: 17, price: 12.95},
  6. {title: 'Pebbles', quantity: 5, price: 6.95}
  7. ];
  8. $scope.totalCart = function() {
  9. var total = 0;
  10. for (var i = 0, len = $scope.items.length; i < len; i++) {
  11. totaltotal = total + $scope.items[i].price * $scope.items[i].quantity;
  12. }
  13. return total;
  14. }
  15. $scope.subtotal = function() {
  16. return $scope.totalCart() - $scope.discount;
  17. };
  18. function calculateDiscount(newValue, oldValue, scope) {
  19. $scope.bill.discount = newValue > 100 ? 10 : 0;
  20. }
  21. $scope.$watch($scope.totalCart, calculateDiscount);
  22. }

注意CartController 的底部,我们在totalCart() 的值上面设置了一个监控,用来计算此次购物的总价。

仅仅要这个值发生变化,监控器就会调用calculateDiscount(), 然后我们就能够把折扣设置为对应的值。假设总价超过100 美元,我们将会把折扣设置为10 美元。

否则,折扣为0。

图2-1 展示了用户将会看到的效果。

angularJS使用$watch监控数据模型的变化的更多相关文章

  1. .NET Core的文件系统[1]:读取并监控文件的变化

    ASP.NET Core 具有很多针对文件读取的应用.比如我们倾向于采用JSON文件来定义配置,所以应用就会涉及针对配置文件读取.如果用户发送一个针对物理文件的HTTP请求,应用会根据指定的路径读取目 ...

  2. JavaScript监控输入框字数变化,超出限制则禁止输入

    JavaScript监控输入框字数变化,超出则禁止输入 不废话,给你看看效果: 1.无输入状态: 2.输入三个字符: 3.超出5个后报错: 现在粘出代码,首先是html代码: <body> ...

  3. angularjs中使用$scope.$watch监控对象模型的变化

    如果对象模型发生变化时,可以使用$scope.$watch监控变化 <html ng-app="myApp"> <head> <title>an ...

  4. AngularJS下拉列表select在option动态变化之后多出了一个错误项的问题

    场景: Select初始化之后,选中select的某个选项 通过AngularJS更新select的选项 错误写法: HTML(使用ng-repeat) <div ng-app="Te ...

  5. 实时监控mysql数据库变化

    对于二次开发来说,很大一部分就找找文件和找数据库的变化情况 对于数据库变化.还没有发现比较好用的监控数据库变化监控软件. 今天,我就给大家介绍一个如何使用mysql自带的功能监控数据库变化 1.打开数 ...

  6. java实时监控mysql数据库变化

    对于二次开发来说,很大一部分就找找文件和找数据库的变化情况 对于数据库变化.还没有发现比较好用的监控数据库变化监控软件. 今天,我就给大家介绍一个如何使用mysql自带的功能监控数据库变化 1.打开数 ...

  7. 160411、实时监控mysql数据库变化

    对于二次开发来说,很大一部分就找找文件和找数据库的变化情况 对于数据库变化.还没有发现比较好用的监控数据库变化监控软件. 今天,我就给大家介绍一个如何使用mysql自带的功能监控数据库变化 1.打开数 ...

  8. [rsync+inotify]——监控客户端文件变化,rsync同步到服务器

    关于rsync的配置请参考博文:http://www.cnblogs.com/snsdzjlz320/p/5630695.html 实验环境 (1) Rsync服务器:10.0.10.158 (2) ...

  9. AngularJS - Apply方法监听model变化

    <body> <div ng-app="myApp"> <div ng-controller="firstController" ...

随机推荐

  1. Viewing the Raw SQL Statement(xcode で)

    Thanks to Core Data. Even without learning SQL and database, you’re able to perform create, select, ...

  2. hdu 5727 Necklace 二分图匹配

    题目链接 给2*n个珠子, n<=9, n个阴n个阳. 然后将它们弄成一个环, 阴阳交替.现在给你m个关系, 每个关系给出a, b. 如果阳a和阴b挨着, 那么a就会变暗. 问你最小变暗几个阳. ...

  3. 0x800a138f - JavaScript runtime error: Unable to get property 'asSorting' of undefined or null reference 错误原因以及解决办法

    使用Jquery Datatables的时候也许会碰到这样的错误提示,当我们仔细的查找代码,发现引用的js文件,css文件均引用了,就是找不到他的问题所在. 这是从我们引用的js文件内部报的错. 这个 ...

  4. 基于Web的系统测试方法

    基于Web的系统测试与传统的软件测试既有相同之处,也有不同的地方,对软件测试提出了新的挑战.基于Web的系统测试不但需要检查和验证是否按照设计的要求运行,而且还要评价系统在不同用户的浏览器端的显示是否 ...

  5. openstack core components use 总结

    1,附加volume(块存储,云硬盘)到vmInstances(虚拟机实列)

  6. Matrix Swapping II(求矩阵最大面积,dp)

    Matrix Swapping II Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  7. struts漏洞修补过程之S2-016

    Struts漏洞修补过程之S2-016.邪恶的Struts再次现身,这一次是远程执行漏洞.官方建议立即升级到2.3.15.1.真希望这是最后一次漏洞修补.下面是升级步骤. 1.升级到struts2.3 ...

  8. HDU ACM 1046 Gridland 找规律

    分析:给出一个矩阵.问最短从一个点经过全部点以此回到起点的长度是多少.绘图非常好理解.先画3*4.3*3.4*4的点阵图案.试着在上面用最短路走一走,能够发现当矩形点阵的长宽都是奇数时,最短路中必然有 ...

  9. S3C2440 之SPI

    概述: S3C2440有两个串行外设SPI接口,SPI具有全双工通信 SPI方框图 SPI操作: 通过使用SPI接口,S3C2440可以与外部器件同时发送.接收8位数据.当SPI接口为主机时,可以通过 ...

  10. mockjax MOCK.js的拦截ajax请求

    今天看了下 mock.js的拦截请求 .https://github.com/nuysoft/Mock/blob/master/src/mockjax.js //覆盖(拦截) Ajax 请求,目前内置 ...