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 相关文章推荐
js 中的switch表达式使用示例
Jun 03 Javascript
jquery 取子节点及当前节点属性值
Jul 25 Javascript
JavaScript字符串对象split方法入门实例(用于把字符串分割成数组)
Oct 16 Javascript
javascript实现连续赋值
Aug 10 Javascript
javascript省市级联功能实现方法实例详解
Oct 20 Javascript
AngularJS  $on、$emit和$broadcast的使用
Sep 05 Javascript
js捕捉键盘事件和按键键值的方法
Oct 10 Javascript
工作中常用的js、jquery自定义扩展函数代码片段汇总
Dec 22 Javascript
JavaScript trim 实现去除字符串首尾指定字符的简单方法
Dec 27 Javascript
jQuery使用siblings获取某元素所有同辈(兄弟姐妹)元素用法示例
Jan 30 Javascript
解决JQuery的ajax函数执行失败alert函数弹框一闪而过问题
Apr 10 jQuery
VUE 直接通过JS 修改html对象的值导致没有更新到数据中解决方法分析
Dec 02 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做推送服务端实现ios消息推送
2013/07/01 PHP
PHP字符串的连接的简单实例
2013/12/30 PHP
详解WordPress开发中过滤属性以及Sql语句的函数使用
2015/12/25 PHP
PHP微信开发之文本自动回复
2016/06/23 PHP
php微信开发之自定义菜单实现
2016/11/18 PHP
Javascript this关键字使用分析
2008/10/21 Javascript
JS逆序遍历实现代码
2014/12/02 Javascript
JS获得选取checkbox整行数据的方法
2015/01/28 Javascript
js实现完全自定义可带多级目录的网页鼠标右键菜单方法
2015/02/28 Javascript
JS实用的动画弹出层效果实例
2015/05/05 Javascript
基于jQuery Ajax实现上传文件
2016/03/24 Javascript
JavaScript代码性能优化总结篇
2016/05/15 Javascript
jQuery实现鼠标经过购物车出现下拉框代码(推荐)
2016/07/21 Javascript
jQuery实现的自适应焦点图效果完整实例
2016/08/24 Javascript
Jquery针对tr td的一些实用操作方法(必看篇)
2016/10/05 Javascript
jquery hover 不停闪动问题的解决方法(亦为stop()的使用)
2017/02/10 Javascript
深入浅出es6模板字符串
2017/08/26 Javascript
通过jquery.cookie.js实现记住用户名、密码登录功能
2018/06/20 jQuery
详解vue开发中调用微信jssdk的问题
2019/04/16 Javascript
angular多语言配置详解
2019/05/16 Javascript
Python使用email模块对邮件进行编码和解码的实例教程
2016/07/01 Python
python dataframe常见操作方法:实现取行、列、切片、统计特征值
2018/06/09 Python
Python3之手动创建迭代器的实例代码
2019/05/22 Python
python实现猜数字游戏
2020/03/25 Python
python matplotlib如何给图中的点加标签
2019/11/14 Python
信号生成及DFT的python实现方式
2020/02/25 Python
使用ITK-SNAP进行抠图操作并保存mask的实例
2020/07/01 Python
python线性插值解析
2020/07/05 Python
Python selenium如何打包静态网页并下载
2020/08/12 Python
CSS3实现文字描边的2种方法(小结)
2020/02/14 HTML / CSS
Topshop美国官网:英国快速时尚品牌
2019/05/16 全球购物
简历的自我评价范文
2014/02/04 职场文书
环保倡议书怎么写
2014/05/16 职场文书
2014年商场工作总结
2014/11/22 职场文书
人身损害赔偿协议书
2016/03/22 职场文书
分析Python感知线程状态的解决方案之Event与信号量
2021/06/16 Python