AngularJS中的$apply方法

简介:

  现在我想在页面上显示一个变量i,i的初始值是0,我希望通过controller每1秒给i加1,使得在页面上i从0,1,2,3,4……一直增长,我会这么做:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
< script  type = "text/javascript" >
     /**
      * Module
      *
      * Description
      */
     angular.module('app', []).controller('firstController',
         function($scope) {
             $scope.i = 0;
             setInterval(function() {
                 $scope.i++;
             }, 1000);
         });
</ script >

    然而这样是没用的,因为i虽然变了,但是没人通知view,页面上的i还是0,不会增长。需要用到apply方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
< script  type = "text/javascript" >
     /**
      * Module
      *
      * Description
      */
     angular.module('app', []).controller('firstController',
         function($scope) {
             $scope.i = 0;
             setInterval(function() {
                 $scope.$apply(function() {
                     $scope.i++;
                 });
             }, 1000);
         });
</ script >

       Angular知道变量改变是通过脏检查实现的,脏检查就是将原对象复制一份快照,在某个时间,比较现在对象和快照的值,如果不一样就是发生了变化。Angular不会脏检查所有对象,当对象被绑定到html中,这个对象才被添加为检查对象。也不会检查所有属性,当属性被绑定时,才会列为检查的属性。

       所有ng开头的事件执行时,都会触发脏检查。而这里自己写的firstController中每次循环执行函数结束后,显然没有触发脏检查。$apply方法就是手动触发脏检查,$apply仅仅是进入angular context,然后通过$digest去触发脏检查。$digest方法负责所属的scope和子scope的脏检查,脏检查又会触发$watch方法。

      $apply()的定义为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$apply:  function (expr) {
         try  {
           beginPhase( '$apply' );
           return  this .$eval(expr);
         catch  (e) {
           $exceptionHandler(e);
         } finally {
           clearPhase();
           try  {
             $rootScope.$digest();
           catch  (e) {
             $exceptionHandler(e);
             throw  e;
           }
         }
       }

   在$digest执行时,如果watch观察到的value和上次的不一样,就会触发$watch方法。

      $watch(watchExp,watchAction,deepWatch)

      watchExp指明要监听的对象,如果watchExp变了,就会执行watchAction,deepWatch得举个例子解释。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<!DOCTYPE html>
< html  ng-app = "app" >
 
< head >
     < meta  charset = "utf-8" >
</ head >
 
< body >
     < div  ng-controller = "firstController" >
         < p  ng-bind = "i" ></ p >
         < input  type = "text"  ng-model = "abc['name']" >
         < input  type = "text"  ng-model = "abc['age']" >
     </ div >
     < script  src = "http://cdn.bootcss.com/angular.js/1.4.0-rc.2/angular.min.js" ></ script >
     < script  type = "text/javascript" >
     angular.module('app', []).controller('firstController',
         function($scope) {
             $scope.i = 0;
             $scope.abc={
                 'name':'Pomelo',
                 'age':21
             }
             $scope.$watch('abc',function(newValue,oldValue){
                 $scope.i++;
             },true);
         });
     </ script >
</ body >
 
</ html >

  在watchExp是个数组时,deepWatch设置为true,只要这里abc中的name或者age变了,都算数组abc变化,如果deepWatch设置为false,改变name或者age,abc都没有变,不会执行watchAcion。上面这段代码是只要name或者age改变,i就自增1。

      










本文转自 iampomelo 51CTO博客,原文链接:http://blog.51cto.com/iampomelo/1658475,如需转载请自行联系原作者
目录
相关文章
|
数据采集 移动开发 监控
Quick Tracking「全域采集与增长分析」,破局全域营销之道
全域采集及增长分析 (Quick Tracking) 是瓴羊推出的企业级流量统计分析产品,支持APP/小程序/H5/Web/IOT等数字应用终端的行为采集分析、私域标签画像、性能体验监控、隐私采集授权管理等数据采集与洞察服务,借助Quick Tracking,技术、产品、运营等同学可以快速按需提取和分析流量数据,衡量产品升级和运营活动效果。
Quick Tracking「全域采集与增长分析」,破局全域营销之道
|
存储 对象存储 容器
Kubernetes如何选择存储以及什么方式使用存储
如何在阿里的Kubernetes容器服务中使用存储
8709 0
Kubernetes如何选择存储以及什么方式使用存储
|
前端开发 API
API接口是什么❓
API即应用程序编程接口,常被称为接口,能够帮助软件之间进行通信并执行特定功能。就如同将黄豆放入豆浆机中,豆浆机(API)接收黄豆(请求参数),并输出豆浆(返回结果)。API使得软件开发更加高效便捷,是互联网产品设计和开发的关键环节。#API接口 #互联网 #产品经理 #技术知识
|
存储 缓存 算法
动态数组技术详解及其在C语言中的应用
动态数组技术详解及其在C语言中的应用
682 0
|
缓存 网络协议 Java
TCP的Window Size和Scale参数对传输效率的影响
目前大多数互联网数据通信都是通过TCP协议进行的,了解其通信方式对提高通信效率,排查通信效率问题有很重要的意义。一. TCP的滑动窗口机制1. 概述TCP协议是可靠的通信协议,数据发送方发送给数据接收方的每一个包必须需要数据接收方返回对应的ACK,否则数据发送方就需要重传这个包。这个模式就有点像我和你面对面聊天,你一句我一句。但这种方式的缺点是效率比较低的。如果你说完一句话,我在处理其他事情,没有
8883 0
|
Web App开发 Android开发 iOS开发
如何在 Gmail 中设置电子邮件转发
您目前有多少个 Gmail 收件箱?您很可能至少拥有一封个人电子邮件和一封工作电子邮件。但也许你也有一个你所属的俱乐部和协会?或者,也许您正在以另一个名字过着秘密的双重生活?处理所有这些收件箱可能会让人筋疲力尽,这就是为什么您需要学习如何在 Gmail 中设置电子邮件转发。
|
JavaScript 前端开发
Vue开发必备:$nextTick方法的理解与实战场景
Vue开发必备:$nextTick方法的理解与实战场景
1177 1
|
并行计算 算法 前端开发
10GBase-T:解锁万兆以太网的新篇章
【10月更文挑战第18天】
1042 3
|
6月前
|
缓存 运维 调度
阿里云CDN怎么添加和修改源站信息?
阿里云CDN源站配置不仅是基础设置,更是智能流量调度的关键。通过灵活添加、修改、删除源站,实现业务高可用与敏捷运维。本文详解操作步骤与最佳实践,助您构建稳定高效的全球加速架构。
|
6月前
|
存储 算法
算法入门:专题一:双指针(有效三角形的个数)
给定一个数组,找出能组成三角形的三元组个数。利用“两边之和大于第三边”的性质,先排序,再用双指针优化。固定最大边,左右指针从区间两端向内移动,若两短边之和大于最长边,则中间所有组合均有效,时间复杂度由暴力的O(n³)降至O(n²)。

热门文章

最新文章

下一篇
开通oss服务