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 相关文章推荐
为数据添加append,remove功能
Oct 03 Javascript
jQuery基础知识filter()和find()实例说明
Jul 06 Javascript
ExtJS4 表格的嵌套 rowExpander应用
May 02 Javascript
javascript定时器完整实例
Feb 10 Javascript
JavaScript类继承及实例化的方法
Jul 25 Javascript
jQuery EasyUI Pagination实现分页的常用方法
May 21 Javascript
浅析Javascript的自动分号插入(ASI)机制
Sep 29 Javascript
JS传参及动态修改页面布局
Apr 13 Javascript
微信小程序图片选择、上传到服务器、预览(PHP)实现实例
May 11 Javascript
浅谈JS中的常用选择器及属性、方法的调用
Jul 28 Javascript
使用vue2.0创建的项目的步骤方法
Sep 25 Javascript
Weex开发之WEEX-EROS开发踩坑(小结)
Oct 16 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
SONY ICF-SW07收音机电路分析
2021/03/02 无线电
如何限制访问者的ip(PHPBB的代码)
2006/10/09 PHP
joomla数据库操作示例代码
2016/01/06 PHP
Laravel框架实现抢红包功能示例
2019/10/31 PHP
iphone safari不支持position fixed的解决方法
2012/05/04 Javascript
IE下JS读取xml文件示例代码
2013/08/05 Javascript
javaScript 动态访问JSon元素示例代码
2013/08/30 Javascript
JS delegate与live浅析
2013/12/21 Javascript
AngularJs定制样式插入到ueditor中的问题小结
2016/08/01 Javascript
js判断是否为空和typeof的用法(详解)
2016/10/07 Javascript
JavaScript实现动态增删表格的方法
2017/03/09 Javascript
nodejs项目windows下开机自启动的方法
2017/11/22 NodeJs
Angular中使用better-scroll插件的方法
2018/03/27 Javascript
微信小程序与后台PHP交互的方法实例分析
2018/12/10 Javascript
Vue开发之封装分页组件与使用示例
2019/04/25 Javascript
[02:53]DOTA2英雄昆卡基础教程
2013/11/25 DOTA
[13:16]INFAMOUS vs VGJ T BO3
2018/06/07 DOTA
在Django中创建第一个静态视图
2015/07/15 Python
python制作小说爬虫实录
2017/08/14 Python
python用插值法绘制平滑曲线
2021/02/19 Python
Python mutiprocessing多线程池pool操作示例
2019/01/30 Python
强悍的Python读取大文件的解决方案
2019/02/16 Python
对Python 简单串口收发GUI界面的实例详解
2019/06/12 Python
python 解决flask 图片在线浏览或者直接下载的问题
2020/01/09 Python
python 元组和列表的区别
2020/12/30 Python
使用python tkinter开发一个爬取B站直播弹幕工具的实现代码
2021/02/07 Python
python网络爬虫实现发送短信验证码的方法
2021/02/25 Python
CSS3混合模式mix-blend-mode/background-blend-mode简介
2018/03/15 HTML / CSS
英国度假别墅预订:Sykes Cottages
2017/06/12 全球购物
The Kooples美国官方网站:为情侣提供的法国当代时尚品牌
2019/01/03 全球购物
Delphi CS笔试题
2014/01/04 面试题
自荐信包含哪些内容
2013/10/30 职场文书
分居协议书范本(律师见证版)
2014/11/26 职场文书
vue中利用mqtt服务端实现即时通讯的步骤记录
2021/07/01 Vue.js
quickjs 封装 JavaScript 沙箱详情
2021/11/02 Javascript
详解Spring Bean的配置方式与实例化
2022/06/10 Java/Android