angularjs – $digest在调用$rootScope时已经在进行中.$apply()
发布时间:2020-12-17 09:57:09 所属栏目:安全 来源:网络整理
导读:所以我有一个AngularJS服务监听一些事件.在处理这些事件时,我需要调用不同的控制器并最终加载新视图.在一个事件处理程序中,我使用$location.path()然后调用$rootScope.apply()来触发到控制器的路由.这适用于该事件,但在其他情况下,我收到以下错误:$rootScop
所以我有一个AngularJS服务监听一些事件.在处理这些事件时,我需要调用不同的控制器并最终加载新视图.在一个事件处理程序中,我使用$location.path()然后调用$rootScope.apply()来触发到控制器的路由.这适用于该事件,但在其他情况下,我收到以下错误:$rootScope:inprog Action已在进行中.我猜测它在第一个场景中有效,因为$rootScope.apply()是从侦听器函数内的另一个回调函数调用的,其他处理程序试图仅从事件侦听器函数调用它.
//angular service $rootScope.$on('MY_EVENT',function (event,msg) { MyClass.doSomething(msg,function (response) { $location.path("/view1"); $rootScope.$apply(); //WORKS FINE }); }); $rootScope.$on('MY_OTHER_EVENT',msg) { $location.path("/view2"); $rootScope.$apply(); //ERROR }); 如何让它适用于所有事件处理程序? plnkr example
问题是它快速连续两次在$rootScope上执行$digest,并在重叠时抛出错误.为了解决这个问题,您可以在$timeout中简单地将两个调用包装到$location.path(),就像您在plnkr示例中第一次完成的那样.这将迫使它等待$digest周期完成.
您也可以删除对$rootScope的显式调用.$apply(). $rootScope.$on('FIRST_EVENT',function(event,msg) { $timeout(function() { $location.path("/view1"); }); }); $rootScope.$on('SECOND_EVENT',msg) { $timeout(function() { $location.path("/view2"); }); }); 注意: 此代码基于plnkr示例,该示例与原始帖子中的代码略有不同. 参考: wait for end of $digest cycle (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
- BootStrap+Angularjs+NgDialog实现模式对话框
- 在scala中从Iterator创建SortedMap
- Bootstrap3基础 form-control 圆角的输入框,光标
- 一次测试多个文件条件(BASH)?
- Angular 2 html检查变量未定义,使用ngif,当值为0
- bootstrap-内联列表-display: inline-block;
- scala – 如何创建一个内容是表达式结果的有限迭
- picture element在angular2和firefox中不起作用
- Angular2 基础实践( 一 )- Hello World(含视频
- TypeDoc找不到Angular2模块
热点阅读