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 相关文章推荐
jquery实现控制表格行高亮实例
Jun 05 Javascript
Jquery ajax执行顺序 返回自定义错误信息(实例讲解)
Nov 06 Javascript
用简洁的jQuery方法toggleClass实现隔行换色
Oct 22 Javascript
jquery文档操作wrap()方法实例简述
Jan 10 Javascript
跟我学习javascript的闭包
Nov 16 Javascript
推荐阅读的js快速判断IE浏览器(兼容IE10与IE11)
Dec 13 Javascript
AngularJS中关于ng-class指令的几种实现方式详解
Sep 17 Javascript
如何实现json数据可视化详解
Nov 24 Javascript
Vue 框架之键盘事件、健值修饰符、双向数据绑定
Nov 14 Javascript
详解vue-cli+es6引入es5写的js(两种方法)
Apr 19 Javascript
javascript for循环性能测试示例
Aug 07 Javascript
Bootstrap table 实现树形表格联动选中联动取消功能
Sep 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
DOMXML函数笔记
2006/10/09 PHP
PHP mail 通过Windows的SMTP发送邮件失败的解决方案
2009/05/27 PHP
在PHP中利用wsdl创建标准webservice的实现代码
2011/12/07 PHP
学习使用curl采集curl使用方法
2012/01/11 PHP
javascript 多浏览器 事件大全
2010/03/23 Javascript
Javascript图像处理—为矩阵添加常用方法
2012/12/27 Javascript
js复制网页内容并兼容各主流浏览器的代码
2013/12/17 Javascript
JS实现图片无间断滚动代码汇总
2014/07/30 Javascript
举例讲解JavaScript中将数组元素转换为字符串的方法
2015/10/25 Javascript
原生JavaScript实现Ajax的方法
2016/04/07 Javascript
SWFUpload多文件上传及文件个数限制的方法
2016/05/31 Javascript
手把手教你把nodejs部署到linux上跑出hello world
2017/06/19 NodeJs
动态创建Angular组件实现popup弹窗功能
2017/09/15 Javascript
Hexo已经看腻了,来手把手教你使用VuePress搭建个人博客
2018/04/26 Javascript
Vue中在新窗口打开页面及Vue-router的使用
2018/06/13 Javascript
解决vue路由后界面没有变化,但是链接有的问题
2018/09/01 Javascript
学习jQuery中的noConflict()用法
2018/09/28 jQuery
微信小程序常用的3种提示弹窗实现详解
2019/09/19 Javascript
[01:19:34]2014 DOTA2国际邀请赛中国区预选赛 New Element VS Dream time
2014/05/22 DOTA
[01:46]新英雄登场
2019/09/10 DOTA
简洁的十分钟Python入门教程
2015/04/03 Python
教你用Python创建微信聊天机器人
2020/03/31 Python
浅谈关于Python3中venv虚拟环境
2018/08/01 Python
Python判断变量名是否合法的方法示例
2019/01/28 Python
Tensorflow: 从checkpoint文件中读取tensor方式
2020/02/10 Python
澳大利亚墨水站Ink Station:墨水和碳粉打印机墨盒
2019/03/24 全球购物
GUESS Factory加拿大:牛仔裤、服装及配饰
2019/09/20 全球购物
英国排名第一的冲浪店:Ann’s Cottage
2020/06/21 全球购物
师范生教师实习自我鉴定
2013/09/27 职场文书
共产党员公开承诺书范文
2014/03/28 职场文书
期末学生评语大全
2014/04/24 职场文书
关于运动会广播稿200字
2014/10/08 职场文书
先进单位事迹材料
2014/12/25 职场文书
民事诉讼答辩状范文
2015/05/21 职场文书
阳光体育运动标语口号
2015/12/26 职场文书
python入门之算法学习
2021/04/22 Python