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之编码规范 推荐
May 23 Javascript
Javascript实现div的toggle效果实例分析
Jun 09 Javascript
jQuery实现的漂亮表单效果代码
Aug 18 Javascript
基于JavaScript实现仿京东图片轮播效果
Nov 06 Javascript
jQuery中ajax的load()与post()方法实例详解
Jan 05 Javascript
js实现一个可以兼容PC端和移动端的div拖动效果实例
Dec 09 Javascript
vue.js实现单选框、复选框和下拉框示例
Jul 18 Javascript
微信小程序开发教程之增加mixin扩展
Aug 09 Javascript
在vue项目中安装使用Mint-UI的方法
Dec 27 Javascript
Material(包括Material Icon)在Angular2中的使用详解
Feb 11 Javascript
vue的常用组件操作方法应用分析
Apr 13 Javascript
Vue.js 使用v-cloak后仍显示变量的解决方法
Nov 19 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 批量删除数据的方法分析
2009/10/30 PHP
PHP语言中global和$GLOBALS[]的分析 之二
2012/02/02 PHP
PHP中防止直接访问或查看或下载config.php文件的方法
2012/07/07 PHP
thinkphp中连接oracle时封装方法无法用的解决办法
2013/06/17 PHP
thinkphp实现图片上传功能
2016/01/13 PHP
JS Loading功能的简单实现
2013/11/29 Javascript
jQuery动态添加元素无法触发绑定事件的解决方法分析
2018/01/02 jQuery
layui 对弹窗 form表单赋值的实现方法
2019/09/04 Javascript
layuiAdmin循环遍历展示商品图片列表的方法
2019/09/16 Javascript
微信小程序canvas分享海报功能
2019/10/31 Javascript
简单谈谈offsetleft、offsetTop和offsetParent
2020/12/04 Javascript
Python设计模式之观察者模式实例
2014/04/26 Python
在Python的web框架中编写创建日志的程序的教程
2015/04/30 Python
Python多线程和队列操作实例
2015/06/21 Python
python创建临时文件夹的方法
2015/07/06 Python
Python3.5 + sklearn利用SVM自动识别字母验证码方法示例
2019/05/10 Python
python使用opencv resize图像不进行插值的操作
2020/07/05 Python
学python最电脑配置有要求么
2020/07/05 Python
python入门:argparse浅析 nargs='+'作用
2020/07/12 Python
2020版Python学习路线图(附学习资料)
2020/09/15 Python
Python pymysql模块安装并操作过程解析
2020/10/13 Python
针对HTML5的Web Worker使用攻略
2015/07/12 HTML / CSS
Piercing Pagoda官网:耳环、戒指、项链、手链等
2020/09/28 全球购物
自我评价范文点评
2013/12/04 职场文书
简单而又朴实的个人求职信分享
2013/12/12 职场文书
演讲稿的写法
2014/05/19 职场文书
励志广播稿300字(5篇)
2014/09/15 职场文书
党的群众路线个人对照检查材料
2014/09/23 职场文书
地陪导游欢迎词
2015/01/26 职场文书
2016年寒假见闻
2015/10/10 职场文书
幼儿园小班开学寄语(2016秋季)
2015/12/03 职场文书
教师实习自我鉴定总结
2019/08/20 职场文书
劳务派遣管理制度(样本)
2019/08/23 职场文书
vue实现简单数据双向绑定
2021/04/28 Vue.js
elasticSearch-api的具体操作步骤讲解
2021/06/28 Java/Android
python机器学习Github已达8.9Kstars模型解释器LIME
2021/11/23 Python