使用$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. [LeetCode]题解(python):146-LRU Cache

    题目来源: https://leetcode.com/problems/lru-cache/ 实现一个LRU缓存.直接上代码. 代码(python): class LRUCache(object): ...

  2. easyui datagrid 列的内容超出所定义的列宽时,自动换行

    定义表单  nowrap="false"可以使得列中的内容超出所定义的列宽是就会自动换行pagination : true, // 当true时在DataGrid底部显示一个分页工 ...

  3. ArcGIS Engine DEM拉伸渲染

    从符号库中取出渲染使用的色带对象IColorRamp(也可以自己定义色带内容) <pre name="code" class="csharp">IS ...

  4. 扩展C++ string类

    在实际开发过程中,C++string类使用起来有很多不方便的地方,笔者根据根据这些不足简单的扩展了这个类,如增加与数字之间的相互转化和格式化字符串.不足的地方望指正.读者也可以根据自己需求继续扩展. ...

  5. [原]命令模式在MVC框架中的应用

    其实在项目开发中,我们使用了大量的设计模式,只是这些设计模式都封装在框架中了,如果你想要不仅仅局限于简单的使用,就应该深入了解框架的设计思路. 在MVC框架中,模式之一就是命令模式,先来看看模式是如何 ...

  6. 柯南君:看大数据时代下的IT架构(4)消息队列之RabbitMQ--案例(Helloword起航)

    柯南君:看大数据时代下的IT架构(4)消息队列之RabbitMQ--案例(Helloword起航) 二.起航 本章节,柯南君将从几个层面,用官网例子讲解一下RabbitMQ的实操经典程序案例,让大家重 ...

  7. Cppcheck软件使用

    一款开源源码检测工具.简单易用. 官网网址:http://cppcheck.sourceforge.net/ 软件可直接官网下载. [plain] view plaincopy Features Ou ...

  8. saiku之固定维度(必选维度)

    工作中遇到的问题,记录下来方便以后查找. 在saiku中如何设定固定维度? 找到WorkspaceDropZone.js文件,在synchronize_query: function(){}方法中的“ ...

  9. javascript第一课javascript:void(0);

    在一些需要使用<a href="#"></a>的地方,把#号换成javascript:void(0); 可以防止在链接跳转到新页面,void(0)放里面的参 ...

  10. POJ 3111 K Best(最大化平均值)

    题目链接:click here~~ [题目大意]有n个物品的重量和价值各自是Wi和Vi.从中选出K个物品使得单位重量的价值最大,输出物品的编号 [解题思路]:最大化平均值的经典.參见click her ...