(二十) 理解和解决angularJS报错$apply already in progress

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

Error: [$rootScope:inprog] $apply already in progress
http://errors.angularjs.org/1.3.13/$rootScope/inprog?p0=%24apply
    at angular.js:63
    at beginPhase (angular.js:14755)
    at Scope.$apply (angular.js:14499)
    at new <anonymous> (1%20-%20%E5%89%AF%E6%9C%AC.html:10)
    at Object.invoke (angular.js:4185)
    at extend.instance (angular.js:8454)
    at angular.js:7700
    at forEach (angular.js:331)
    at nodeLinkFn (angular.js:7699)
    at compositeLinkFn (angular.js:7078)
下面这段代码就会报上面这个错误:
 var myModule = angular.module('myModule', []);  
 myModule.controller("ctrl_1",function($scope){
	$scope.value = "aty";
	$scope.$apply();
	//$scope.$digest();
 });

这个错误其实很好理解:angularJS框架本身已经在做脏数据检测了,我们没有必要再手动调用$apply或者$digest。这里自然而然出现了一个疑问:什么时候需要我们手动调用$apply或者$digest,什么时候不需要呢?这是个好问题,我现在也不知道,目前我只能列出自己在项目中遇到的2种需要手动调用$apply的情况。


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

<html>
  <h
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值