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 日期分离成年月日的代码
May 14 Javascript
js根据给定的日期计算当月有多少天实现思路及代码
Feb 25 Javascript
教你如何使用firebug调试功能了解javascript闭包和this
Mar 04 Javascript
jQuery实现最简单的切换图效果【可兼容IE6、火狐、谷歌、opera等】
Sep 04 Javascript
使用BootStrap和Metroui设计的metro风格微网站或手机app界面
Oct 21 Javascript
Vue.js render方法使用详解
Apr 05 Javascript
详解Angular 4.x Injector
May 04 Javascript
JavaScript实现简单的树形菜单效果
Jun 23 Javascript
mint-ui 时间插件使用及获取选择值的方法
Feb 09 Javascript
JavaScript 实现同时选取多个时间段的方法
Oct 17 Javascript
稍微学一下Vue的数据响应式(Vue2及Vue3区别)
Nov 21 Javascript
JavaScript数组去重实现方法小结
Jan 17 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源代码安装常见错误与解决办法分享
2013/05/28 PHP
一段实用的php验证码函数
2016/05/19 PHP
PHP中PDO事务处理操作示例
2018/05/02 PHP
JS 获取span标签中的值的代码 支持ie与firefox
2009/08/24 Javascript
为调试JavaScript添加输出窗口的代码
2010/02/07 Javascript
Nodejs进程管理模块forever详解
2014/06/01 NodeJs
javascript快速排序算法详解
2014/09/17 Javascript
js正则表达式匹配数字字母下划线等
2015/04/14 Javascript
最新最热最实用的15个jQuery插件汇总
2015/07/05 Javascript
基于JQuery打造无缝滚动新闻步骤详解
2016/03/31 Javascript
JS实现的自定义显示加载等待图片插件(loading.gif)
2016/06/17 Javascript
详解jquery easyui之datagrid使用参考
2016/12/05 Javascript
vue中mint-ui环境搭建详细介绍
2017/04/06 Javascript
微信小程序日历组件calendar详解及实例
2017/06/08 Javascript
vue-resource拦截器设置头信息的实例
2017/10/27 Javascript
layui框架中layer父子页面交互的方法分析
2017/11/15 Javascript
详解Vue快速零配置的打包工具——parcel
2018/01/16 Javascript
ECharts地图绘制和钻取简易接口详解
2019/07/12 Javascript
VUEX 数据持久化,刷新后重新获取的例子
2019/11/12 Javascript
JS实现手写 forEach算法示例
2020/04/29 Javascript
jQuery实现动态加载瀑布流
2020/09/01 jQuery
Python3获取拉勾网招聘信息的方法实例
2019/04/03 Python
python输出数学符号实例
2020/05/11 Python
pytorch查看通道数 维数 尺寸大小方式
2020/05/26 Python
html5 canvas绘制放射性渐变色效果
2018/01/04 HTML / CSS
ORLY官网:美国专业美甲一线品牌
2019/12/11 全球购物
空字符串(“”)和null的区别
2012/11/13 面试题
房地产销售大学生自我评价分享
2013/11/11 职场文书
教师自荐信范文
2013/12/09 职场文书
学校庆元旦歌咏比赛主持词
2014/03/18 职场文书
研发工程师岗位职责
2014/04/28 职场文书
团日活动总结报告
2014/06/25 职场文书
2015年学校政教工作总结
2015/07/20 职场文书
读《解忧杂货店》有感:请相信一切都是最好的安排
2019/11/07 职场文书
再见,2019我们不负使命;你好,2020我们砥砺前行
2020/01/03 职场文书
Python手拉手教你爬取贝壳房源数据的实战教程
2021/05/21 Python