【问题标题】:$digest already in progress when calling $rootScope.$apply() in quick succession快速连续调用 $rootScope.$apply() 时 $digest 已在进行中
【发布时间】:2014-09-28 17:05:25
【问题描述】:

所以我有一个 AngularJS 服务来监听一些事件。在处理这些事件时,我需要调用不同的控制器并最终加载一个新视图。在一个事件处理程序中,我使用 $location.path() 然后调用 $rootScope.apply() 来触发到控制器的路由。这适用于该事件,但在其他事件中我收到以下错误:$rootScope:inprog Action Already In Progress。我猜它在第一种情况下有效,因为 $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', function (event, msg) {
    $location.path("/view2");
    $rootScope.$apply();           //ERROR
});

如何让它适用于所有事件处理程序?

plnkr example

【问题讨论】:

    标签: angularjs events location rootscope angularjs-digest


    【解决方案1】:

    问题是它在$rootScope 上快速连续执行两次$digest,并且在重叠时抛出错误。为了解决这个问题,您可以简单地将两个对 $location.path() 的调用包装在 $timeout 中,就像您在 plnkr 示例中第一次所做的那样。这将迫使它等待$digest 循环完成。

    您还可以删除对$rootScope.$apply() 的显式调用。

    $rootScope.$on('FIRST_EVENT', function(event, msg) {
      $timeout(function() {
        $location.path("/view1");
      });
    });
    
    $rootScope.$on('SECOND_EVENT', function(event, msg) {
      $timeout(function() {
        $location.path("/view2");
      });
    });
    

    注意:

    此代码基于 plnkr 示例,与原帖中的代码略有不同。

    参考:

    wait for end of $digest cycle

    【讨论】:

    • 我试过了,但没有运气。路由不会在任何时候触发。
    • 你能创建一个示例 jsfiddle 或 plunkr 吗?
    • 当然。在我这样做之前,我还要提一下,MY_EVENT 总是在 MY_OTHER_EVENT 之前触发。这两个事件之间的时间是不确定的。
    • 好的。我认为,如果您可以创建一个复制此示例的示例,它将帮助我自己/其他人识别问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    • 2013-01-28
    • 1970-01-01
    • 1970-01-01
    • 2018-06-14
    相关资源
    最近更新 更多