angularjs – $digest在调用$rootScope时已经在进行中.$apply()快速连续

前端之家收集整理的这篇文章主要介绍了angularjs – $digest在调用$rootScope时已经在进行中.$apply()快速连续前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
所以我有一个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

原文链接:https://www.f2er.com/angularjs/140333.html

猜你在找的Angularjs相关文章