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 相关文章推荐
JavaScript关于select的相关操作说明
Jan 13 Javascript
javascript中的对象创建 实例附注释
Feb 08 Javascript
『JavaScript』限制Input只能输入数字实现思路及代码
Apr 22 Javascript
JS JQUERY实现滚动条自动滚到底的方法
Jan 09 Javascript
js实现遮罩层弹出框的方法
Jan 15 Javascript
jQuery的框架介绍
May 11 Javascript
jquery判断input值不为空的方法
Jun 05 Javascript
vuejs2.0子组件改变父组件的数据实例
May 10 Javascript
vue 注册组件的使用详解
May 05 Javascript
在vue中v-bind使用三目运算符绑定class的实例
Sep 29 Javascript
jQuery选择器之基本选择器用法实例分析
Feb 19 jQuery
js实现简单音乐播放器
Jun 30 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
星际争霸任务指南——人族
2020/03/04 星际争霸
php中mail函数发送邮件失败的解决方法
2014/12/24 PHP
php在线解压ZIP文件的方法
2014/12/30 PHP
php读取文件内容的方法汇总
2015/01/24 PHP
php中使用gd库实现下载网页中所有图片
2015/05/12 PHP
php将一维数组转换为每3个连续值组成的二维数组
2016/05/06 PHP
php实现根据身份证获取精准年龄
2020/02/26 PHP
30个最佳jQuery Lightbox效果插件分享
2011/04/11 Javascript
JS判断字符串长度的5个方法(区分中文和英文)
2014/03/18 Javascript
Javascript验证用户输入URL地址是否为空及格式是否正确
2014/10/09 Javascript
JS动态显示表格上下frame的方法
2015/03/31 Javascript
jQuery获取元素父节点的方法
2016/06/21 Javascript
AngularJS控制器详解及示例代码
2016/08/16 Javascript
微信小程序中的onLoad详解及简单实例
2017/04/05 Javascript
详解vue中引入stylus及报错解决方法
2017/09/22 Javascript
JavaScript如何获取到导航条中HTTP信息
2017/10/10 Javascript
swiper在vue项目中loop循环轮播失效的解决方法
2018/09/15 Javascript
javascript异步编程的六种方式总结
2019/05/17 Javascript
[42:36]DOTA2上海特级锦标赛B组败者赛 VG VS Spirit第二局
2016/02/26 DOTA
Python常用知识点汇总
2016/05/08 Python
Django自定义分页与bootstrap分页结合
2021/02/22 Python
Tornado协程在python2.7如何返回值(实现方法)
2017/06/22 Python
windows 下python+numpy安装实用教程
2017/12/23 Python
Python的CGIHTTPServer交互实现详解
2018/02/08 Python
python中从str中提取元素到list以及将list转换为str的方法
2018/06/26 Python
Python反射和内置方法重写操作详解
2018/08/27 Python
Python数学形态学实例分析
2019/09/06 Python
Django使用rest_framework写出API
2020/05/21 Python
Becextech新西兰:数码单反相机和手机在线商店
2018/04/27 全球购物
校园学雷锋活动月总结
2014/03/09 职场文书
小学评语大全
2014/04/22 职场文书
2014年居委会工作总结
2014/12/09 职场文书
2015年乡镇卫生院工作总结
2015/04/22 职场文书
安全教育主题班会总结
2015/08/14 职场文书
nginx部署多前端项目的几种方法
2021/05/25 Servers
《王者天下》第4季首话新剧照 4月9日正式开播
2022/04/07 日漫