AngularJS中$apply方法和$watch方法用法总结


Posted in Javascript onDecember 13, 2016

本文实例总结了AngularJS中$apply方法和$watch方法用法。分享给大家供大家参考,具体如下:

引言

最近在项目中封装控件的时候用到了$watch方法来监听module中的值的变化,当时小编对这个方法不是很了解,所以在网上找了一些资料来学习一下,下面小编就给大家简单介绍一些AngularJS中Scope 提供$apply 方法传播Model 的变化和$watch方法监听module变化。

$apply使用情景

AngularJS 外部的控制器(DOM 事件、外部的回调函数如 jQuery UI 空间等)调用了AngularJS 函数之后,必须调用$apply。在这种情况下,你需要命令 AngularJS 刷新自已(模型、视图等),$apply就是用来做这件事情的。我们在使用$apply这个方法的时候,只要可以,请把要执行的代码和函数传递给$apply 去执行,而不要自已执行那些函数然后再调用$apply。

下面看一个Demo,写一个定时器在两秒以后改变name的值:

<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <title>RunJS</title>
  <script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
  <script src="http://cdn.bootcss.com/angular.js/1.2.9/angular-route.min.js"></script>
  <script src="serviceJS01.js"></script>
</head>
<body ng-app="myApp" >
<div ng-controller="firstController" ng-click="show()">
{{name}}
  {{age}}
</div>
</body>
</html>
<script>
  var app = angular.module("myApp",[]);
  app.controller('firstController',function($scope,$timeout){
    setTimeout(function(){
      $scope.$apply(function(){
        $scope.name="李四";
      })
    },2000);
    $scope.name="张三";
    $scope.age='10';
    $scope.show=function(){
      $scope.name='点击后的name';
    }
  $timeout(function(){
    $scope.age='50';
  },2000);
  })
</script>

在上面代码中如果我们不使用$apply来传播name值的改变,而是直接将$scope.name="李四"这句代码写在setTimeout函数中,界面上显示的值根本就不会改变。

$watch方法监听module变化

当你的数据模型中某一部分发生变化时,$watch 函数可以向你发出通知。你可以监控单个对象的属性,也可以监控需要经过计算的结果(函数),实际上只要能够被当作属性访问到,或者可以当作一个JavaScript 函数被计算出来,就可以被$watch 函数监控。它的函数签名为:

$watch(watchFn, watchAction, deepWatch)

watchFn参数:这个是我们监听地方目标对象,它是一个带有angular表达式或者函数的字符串;

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

deepWatch参数:如果设置为true,这个可选的布尔型参数将会命令Angular 去检查被监控对象的每个属性是否发生了变化。如果你想要监控数组中的元素,或者对象上的所有属性,而不只是监控一个简单的值,你就可以使用这个参数。

下面看一个Demo,当费用超过100的时候,运费为0否则运费为10:

<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <title>RunJS</title>
  <script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
  <script src="http://cdn.bootcss.com/angular.js/1.2.9/angular-route.min.js"></script>
  <script src="serviceJS01.js"></script>
</head>
<body ng-app="myApp" >
<div ng-controller="firstController" ng-click="show()">
  <p>价格:<input type="text" ng-model="iphone.money"></p>
  <p>个数:<input type="text" ng-model="iphone.num"></p>
  <p>费用: <span>{{sum() | currency:'¥'}}</span></p>
  <p>运费: <span>{{iphone.fre | currency:'¥'}}</span></p>
  <p>总额: <span>{{sum() + iphone.fre | currency:'¥'}}</span></p>
</div>
</body>
</html>
<script>
  var app = angular.module("myApp",[]);
  app.controller('firstController',function($scope){
  $scope.iphone={
    money:5,
    num:1,
    fre:10
  };
    $scope.sum=function(){
      return $scope.iphone.money * $scope.iphone.num;
    }
    $scope.$watch($scope.sum,function(newValue,oldValue){
      $scope.iphone.fre=newValue>=100?0:10
    })
  })
</script>

$watch这个函数在项目中会经常用到,所以我们需要对这个函数灵活的掌握,这样我们在自定控件或者完成一些比较复杂的需求的时候很更加的方便。

小结

以上是小编对中两个方法的总结,这些都是比较入门的知识,如果想更好的对这些知识了解还需要我们在项目中好好的研究。

源码地址:http://runjs.cn/code/ovjwuxhn

希望本文所述对大家AngularJS程序设计有所帮助。

Javascript 相关文章推荐
Display SQL Server Version Information
Jun 21 Javascript
设置下载不需要倒计时cookie(倒计时代码)
Nov 19 Javascript
事件委托与阻止冒泡阻止其父元素事件触发
Sep 02 Javascript
深入理解JavaScript系列(37):设计模式之享元模式详解
Mar 04 Javascript
jQuery自制提示框tooltip改进版
Aug 01 Javascript
angularjs实现多张图片上传并预览功能
Feb 24 Javascript
微信小程序页面传值实例分析
Apr 19 Javascript
解决element ui select下拉框不回显数据问题的解决
Feb 20 Javascript
Vue.js轮播图走马灯代码实例(全)
May 08 Javascript
Node对CommonJS的模块规范
Nov 06 Javascript
原生JavaScript实现滑动拖动验证的示例代码
Dec 06 Javascript
JavaScript实现省市区三级联动
Feb 13 Javascript
vue.js学习之递归组件
Dec 13 #Javascript
AngularJS过滤器filter用法总结
Dec 13 #Javascript
ES6通过babel转码使用webpack使用import关键字
Dec 13 #Javascript
AngularJS服务service用法总结
Dec 13 #Javascript
Vue.js中用v-bind绑定class的注意事项
Dec 13 #Javascript
AngularJS中的Promise详细介绍及实例代码
Dec 13 #Javascript
JS中事件冒泡和事件捕获介绍
Dec 13 #Javascript
You might like
PHP iconv 函数转gb2312的bug解决方法
2009/10/11 PHP
php中取得URL的根域名的代码
2011/03/23 PHP
PHP中include/require/include_once/require_once使用心得
2016/08/28 PHP
JavaScript 精粹读书笔记(1,2)
2010/02/07 Javascript
利用Jquery实现可多选的下拉框
2014/02/21 Javascript
javascript学习笔记(六)数据类型和JSON格式
2014/10/08 Javascript
基于Vue如何封装分页组件
2016/12/16 Javascript
详解js前端代码异常监控
2017/01/11 Javascript
vue双向绑定简要分析
2017/03/23 Javascript
Node.js安装配置图文教程
2017/05/10 Javascript
Nodejs搭建wss服务器教程
2017/05/24 NodeJs
async/await地狱该如何避免详解
2018/05/10 Javascript
JavaScript中的ES6 Proxy的具体使用
2019/06/16 Javascript
VUE使用axios调用后台API接口的方法
2020/08/03 Javascript
[02:00]最后,我终于出了辉耀
2018/03/27 DOTA
[01:18:45]DOTA2-DPC中国联赛 正赛 DLG vs Dragon BO3 第三场2月1日
2021/03/11 DOTA
python操作MySQL数据库具体方法
2013/10/28 Python
python开发中range()函数用法实例分析
2015/11/12 Python
Python网络编程中urllib2模块的用法总结
2016/07/12 Python
python 链接和操作 memcache方法
2017/03/04 Python
python使用正则筛选信用卡
2019/01/27 Python
Python3 实现串口两进程同时读写
2019/06/12 Python
总结python 三种常见的内存泄漏场景
2020/11/20 Python
Python数据分析库pandas高级接口dt的使用详解
2020/12/11 Python
俄罗斯皮肤健康中心:Pharmacosmetica.ru
2020/02/22 全球购物
公证委托书大全
2014/04/04 职场文书
2014年村支部书记四风对照检查材料思想汇报
2014/10/02 职场文书
捐助倡议书
2015/01/19 职场文书
万能检讨书开头与结尾怎么写
2015/02/17 职场文书
教师工作表现自我评价
2015/03/05 职场文书
2015年文明创建工作总结
2015/04/30 职场文书
门球健将观后感
2015/06/16 职场文书
创业不要错过,这4种餐饮新模式
2019/07/18 职场文书
教你怎么用Python操作MySql数据库
2021/05/31 Python
Axios取消重复请求的方法实例详解
2021/06/15 Javascript
排查并解决MySQL生产库内存使用率高的报警
2022/04/11 MySQL