angularJS报错$apply already in progress的原因和解决方法

如果我们使用了AngularJS中的$scope.$apply()或者$scope.$digest(),我们很可能会遇到类似下面的错误,虽然这个错误没有太大影响,但是在日志中看起来还是很不爽的,日志中记录的异常或者错误,就应该是需要关注和解决的问题,否则就没有必要出现在日志中了。

原因是:angularjs框架本身已经在做脏数据检测了,我们没有必要再手动调用$apply或者$digest。这里自然而然出现了一个疑问:什么时候需要我们手动调用$apply或者$digest,什么时候不需要呢?先列出以下两种情况:

情况1:controller中如果有异步操作,比如ajax回调,timeout延时等。可以这么理解:由于异步(延迟)的存在,当开始执行回调函数的时候,angularJS自身controller中的脏值检测已经结束,无法检测到回调函数导致数据的变化。

 1 //html
 2 <div>{{text}}</div>
 3
 4 //js
 5 var myModule = angular.module(‘myModule‘, []);
 6 myModule.controller("ctrl_1",function($scope){
 7      $scope.text = "place";
 8
 9       setTimeout(function(){
10            $scope.text = "value setted after time out";
11            $scope.$apply();//必需手动进行脏值检测,否则数据无法刷新到界面
12        },1000);
13
14 });  

用$timeout service来代替setTimeout(),不需要手动调用$apply(), $timeout service会自动调用$apply();

情况2:在jQuery代码中修改$scope中的数据。这种情况是在angular框架之外操作$scope中的数据,angular不能检测到数据变化是正常的。

//js
<script>  

var myModule = angular.module(‘myModule‘, []);
myModule.controller("ctrl_1",function($scope){
            $scope.text = "place";
});   

$(function(){
     angular.bootstrap($("#div1")[0], ["myModule"]);   

      $("#btn").click(function(){
             var $scope = $("#btn").scope();
             $scope.text = "value setted in jquery";
             $scope.$apply();
       });
})
</script> 

//html
<div id="div1" ng-controller="ctrl_1">
        <div>{{text}}</div>
        <input id="btn" type="button" value="jquery-event"></input>
    </div>   

如何判断是否需要手动调用$apply()呢?

$$phase 是 angluar 内部使用的状态标志位,用于标识当前是否处于 digest 状态。

$scope.safeApply = function(fn){
   var phase = this.$root.$$phase;
   if (phase == ‘$apply‘ || phase == ‘$digest‘) {
       if (fn && ( typeof (fn) === ‘function‘)) {
          fn();
       }
   } else {
       this.$apply(fn);
   }
}
时间: 2024-11-08 04:41:46

angularJS报错$apply already in progress的原因和解决方法的相关文章

报错:Could not launch &#39;app name&#39;,解决方法

如果你也出現了“Could not launch 'app name'”,No such file or directory (/Users/apple/Library/Developer/Xcode/DerivedData/mytest-ejkagqxooxgmtdfsdoygtyzflibe/Build/Products/Debug-iphoneos/mytest.app/mytest) 这样的讯息的話,有几个处理方法1.刪除DerivedData資料夾法1.1 完全离开Xcode,然后再做

安装center报The DSN is pointing to anunspported ODBC driver...解决方法 &nbsp; &nbsp;

vcenter和数据库分开时,在安装center的主机上若没有sqlserver native客户端,就会出现如下错误 中文: 英文: 解决办法: 方法一:可以去微软官网下载sqlncli.msc补丁(即sqlserver native客户端),注意要对应相应的数据库版本,高版本可以兼容低版本 sqlserver 2008 R2版本的sqlncli.msc下载 http://download.microsoft.com/download/B/6/3/B63CAC7F-44BB-41FA-92A3

python中引入包的时候报错AttributeError: module &#39;sys&#39; has no attribute &#39;setdefaultencoding&#39;解决方法?

python中引入包的时候报错:import unittestimport smtplibimport timeimport osimport sysimp.reload(sys)sys.setdefaultencoding('utf-8') AttributeError: module 'sys' has no attribute 'setdefaultencoding'解决方法: 1.python2中解决方法:reload(sys)sys.setdefaultencoding('utf-8'

python 编码报错问题 &#39;ascii&#39; codec can&#39;t encode characters 解决方法

python在安装时,默认的编码是ascii, 当程序中出现非ascii编码时,python的处理常常会报这样的错 'ascii' codec can't encode characters python没办法处理非ascii编码的, 此时需要自己设置将python的默认编码,一般设置为utf8的编码格式. 查看python的默认编码 print sys.getdefaultencoding() 解决方法一(已通过验证,顺带也解决了我之前字符前一直加u的问题) 在python安装目录下,进入\P

Centos6 下启动httpd报错 Could not reliably determine the server&#39;s解决方法

在启动httpd的时候报错: 修改/etc/httpd/conf/httpd.conf 配置,去掉ServerName 前的#(或者手动添加ServerName localhost:80)然后重启httpd服务: Centos6 下启动httpd报错 Could not reliably determine the server's解决方法

Mac OS X+AspectJ+JDK 8,报Invalid byte tag in constant pool: 18的解决方法

这个问题也挺让人无语的,昨天重新装了Mac OS X,然后装JDK,想都没想就装了JDK 8,然后开始实验,结果就报类似于下面这种Exception: org.aspectj.apache.bcel.classfile.ClassFormatException: File: 'java.util.Comparator': Invalid byte tag in constant pool: 18 看了一下,觉得像是JDK版本引起的问题,所以就想换成JDK 7,这里简单说说怎么在Mac OS X中

keil 通过JTAG下载程序 报错:error: flash download failed - &quot;cortex-m3&quot;的解决方法

硬件环境: nxp lpc1788fbd208核心板 软件环境: keil uvision4 segger j-flash arm v4.50 其他: 芯片选择正确 jtag模式 现象:之前用JFlashARM.exe下载了程序,在没有擦除程序的情况下,JTAG模式下用keil下载程序 报错 error: flash download failed - "cortex-m3" 原因:用jFlashARM.exe下载程序后,没有擦除程序 解决:擦除lpc1788 上的程序,然后在keil

很爽的一点。用Mysql5.x以上版本出现报错#1929 Incorrect datetime value: &#39;&#39; for column &#39;createtime&#39; 解决方法

我的mysql安装后,保存删除表数据总是出现#1929 Incorrect datetime value: '' for column 'createtime' 的报错提醒,导致不能删除表里数据: 原因: 5以上的版本如果时期时间是空值应该要写NULL: 官方解释说:得知新版本mysql对空值插入有"bug", 要在安装mysql的时候去除默认勾选的enable strict SQL mode 那么如果我们安装好了mysql怎么办了,解决办法是更改mysql中的配置 my.ini 解决

navicat报错2005 - Unknown MySQL server host &#39;localhost&#39; (0) 原因及解决方法

报错原因:没有连接互联网,用navicat连接本地mysql数据库,连接属性ip为localhost. 解决办法:将ip改为127.0.0.1即可.localhost是需要DNS解析后才会是127.0.0.1的. navicat报错2005 - Unknown MySQL server host 'localhost' (0) 原因及解决方法 原文地址:https://www.cnblogs.com/Y-zhiwei/p/8458238.html