angularJS使用$watch监控数据模型的变化
使用$watch监控数据模型的变化
在scope 内置的全部函数中,用得最多的可能就是$watch 函数了。当你的数据模型中某一部分发生变化时,$watch 函数能够向你发出通知。你能够监控单个对象的属性。也能够监控须要经过计算的结果(函数),实际上仅仅要能够被当作属性訪问到,或者能够当作一个JavaScript 函数被计算出来,就能够被$watch 函数监控。它的函数签名为
- $watch(watchFn, watchAction, deepWatch)
当中每一个參数的具体含义例如以下。
watchFn
该參数是一个带有Angular 表达式或者函数的字符串,它会返回被监控的数据模型的当前值。这个表达式将会被运行非常多次。所以你要保证它不会产生其它副作用。也就是说,要保证它能够被调用非常多次而不会改变状态。基于相同的原因。监控表达式应该非常easy被计算出来。假设你使用字符串传递了一个Angular 表达式,那么它将会针对调用它的那个作用域中的对象而运行。
watchAction
这是一个函数或者表达式,当watchFn 发生变化时会被调用。假设是函数的形式,它将会接收到watchFn 的新旧两个值,以及作用域对象的引用。其函数签名为function(newValue, oldValue, scope)。
deepWatch
假设设置为true,这个可选的布尔型參数将会命令Angular 去检查被监控对象的每一个属性是否发生了变化。假设你想要监控数组中的元素。或者对象上的全部属性,而不仅仅是监控一个简单的值,你就能够使用这个參数。因为Angular 须要遍历数组或者对象。假设集合比較大,那么运算负担就会比較重。
$watch 函数会返回一个函数。当你不再须要接收变更通知时,能够用这个返回的函数注销监控器。
假设我们须要监控一个属性。然后接着注销监控。我们能够使用下面代码:
- ...
- var dereg = $scope.$watch('someModel.someProperty', callbackOnChange());
- …
- dereg();
我们再回到第1 章的购物车案例。把它的功能扩充完整。
比如。当用户加入到购物车中的商品价值超过100 美元的时候,我们会给他10 美元的折扣。我们将会使用以下这样的模板:
- <div ng-controller="CartController">
- <div ng-repeat="item in items">
- <span>{{item.title}}</span>
- <input ng-model="item.quantity">
- <span>{{item.price | currency}}</span>
- <span>{{item.price * item.quantity | currency}}</span>
- </div>
- <div>Total: {{totalCart() | currency}}</div>
- <div>Discount: {{bill.discount | currency}}</div>
- <div>Subtotal: {{subtotal() | currency}}</div>
- </div>
而CartController 看起来可能像以下这样:
- function CartController($scope) {
- $scope.bill = {};
- $scope.items = [
- {title: 'Paint pots', quantity: 8, price: 3.95},
- {title: 'Polka dots', quantity: 17, price: 12.95},
- {title: 'Pebbles', quantity: 5, price: 6.95}
- ];
- $scope.totalCart = function() {
- var total = 0;
- for (var i = 0, len = $scope.items.length; i < len; i++) {
- totaltotal = total + $scope.items[i].price * $scope.items[i].quantity;
- }
- return total;
- }
- $scope.subtotal = function() {
- return $scope.totalCart() - $scope.discount;
- };
- function calculateDiscount(newValue, oldValue, scope) {
- $scope.bill.discount = newValue > 100 ? 10 : 0;
- }
- $scope.$watch($scope.totalCart, calculateDiscount);
- }
注意CartController 的底部,我们在totalCart() 的值上面设置了一个监控,用来计算此次购物的总价。
仅仅要这个值发生变化,监控器就会调用calculateDiscount(), 然后我们就能够把折扣设置为对应的值。假设总价超过100 美元,我们将会把折扣设置为10 美元。
否则,折扣为0。
图2-1 展示了用户将会看到的效果。
angularJS使用$watch监控数据模型的变化的更多相关文章
- .NET Core的文件系统[1]:读取并监控文件的变化
ASP.NET Core 具有很多针对文件读取的应用.比如我们倾向于采用JSON文件来定义配置,所以应用就会涉及针对配置文件读取.如果用户发送一个针对物理文件的HTTP请求,应用会根据指定的路径读取目 ...
- JavaScript监控输入框字数变化,超出限制则禁止输入
JavaScript监控输入框字数变化,超出则禁止输入 不废话,给你看看效果: 1.无输入状态: 2.输入三个字符: 3.超出5个后报错: 现在粘出代码,首先是html代码: <body> ...
- angularjs中使用$scope.$watch监控对象模型的变化
如果对象模型发生变化时,可以使用$scope.$watch监控变化 <html ng-app="myApp"> <head> <title>an ...
- AngularJS下拉列表select在option动态变化之后多出了一个错误项的问题
场景: Select初始化之后,选中select的某个选项 通过AngularJS更新select的选项 错误写法: HTML(使用ng-repeat) <div ng-app="Te ...
- 实时监控mysql数据库变化
对于二次开发来说,很大一部分就找找文件和找数据库的变化情况 对于数据库变化.还没有发现比较好用的监控数据库变化监控软件. 今天,我就给大家介绍一个如何使用mysql自带的功能监控数据库变化 1.打开数 ...
- java实时监控mysql数据库变化
对于二次开发来说,很大一部分就找找文件和找数据库的变化情况 对于数据库变化.还没有发现比较好用的监控数据库变化监控软件. 今天,我就给大家介绍一个如何使用mysql自带的功能监控数据库变化 1.打开数 ...
- 160411、实时监控mysql数据库变化
对于二次开发来说,很大一部分就找找文件和找数据库的变化情况 对于数据库变化.还没有发现比较好用的监控数据库变化监控软件. 今天,我就给大家介绍一个如何使用mysql自带的功能监控数据库变化 1.打开数 ...
- [rsync+inotify]——监控客户端文件变化,rsync同步到服务器
关于rsync的配置请参考博文:http://www.cnblogs.com/snsdzjlz320/p/5630695.html 实验环境 (1) Rsync服务器:10.0.10.158 (2) ...
- AngularJS - Apply方法监听model变化
<body> <div ng-app="myApp"> <div ng-controller="firstController" ...
随机推荐
- 001.web前端-学习了解
学习web前端开发基础技术需要掌握:HTML.CSS.JavaScript语言.下面我们就来了解下这三门技术都是用来实现什么的: 1.html(Hypertext Markup Language)—— ...
- background:url 的使用方法
#pingfen li{ width:27px; float:left; height:28px; cursor:pointer; background:url( ; list-style:none; ...
- codeforces 665E Beautiful Subarrays
题目链接 给一个数列, 让你找出异或结果大于等于k的子序列的个数. 因为任意一段序列的异或值都可以用前缀异或和来表示, 所以我们先求出前缀异或和. 我们考虑字典树, 对于每一个前缀sum, 我们先查询 ...
- hacker入门篇——相关书籍
1.<黑客大曝光:网络安全机密与解决方案(第7版)> 简介:这是一本老外写的书,比较适合入门看,内容包括一些基本的攻防流程,基本工具软件,网络安全的一些基本概念等,对整个网络安全和黑客入侵 ...
- web中webAppRootKey作用
<context-param> <param-name>webAppRootKey</param-name> <param-value>bgn.root ...
- ReactNative实现通知监听事件
事例1: 只在rn里面发送和接受消息. A界面: import {DeviceEventEmitter} from 'react-native'; //... componentDidMount(){ ...
- 程序猿的量化交易之路(20)--Cointrader之Assert实体(8)
转载需说明出处:http://blog.csdn.net/minimicall, http://cloudtrade.top 不论什么可交易的都能够称之为Assert,资产.其类代码例如以下: pac ...
- android项目的的目录结构
然后我们看一下Helloword的程序目录: 我们可以看到 大致有的文件: 1. MainHelloWorld.java文件 2. R.java文件 3. android.jar文件 4. RES.L ...
- SQL Server索引进阶:第十三级,插入,更新,删除
在第十级到十二级中,我们看了索引的内部结构,以及改变结构造成的影响.在本文中,继续查看Insert,update,delete和merge造成的影响.首先,我们单独看一下这四个命令. 插入INSERT ...
- vs2010调试快捷键
VS2010单步调试 1.设置断点 F9设置或者取消断点,如果当前行未设置断点,则F9可以再当前行设置断点,如果已经设置,则为去除断点 2.单步调试 F10不进入函数单步,F11进入函数单步 , ...