gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:50:09 24 4
gpt4 key购买 nike

所以我有一个AngularJS服务来监听一些事件。在处理这些事件时,我需要调用不同的 Controller 并最终加载一个新 View 。在一个事件处理程序中,我使用$ location.path()然后调用$ rootScope.apply()触发到 Controller 的路由。对于该事件,此方法工作正常,但在其他事件中,出现以下错误:$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

最佳答案

问题在于,它在$digest上连续快速执行了两次$rootScope,并且在出现重叠时抛出错误。要解决此问题,您可以像在plnkr示例中第一次完成一样,将两个对$location.path()的调用都包装在$timeout中。这将迫使它等待$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

关于angularjs - 快速连续调用$ rootScope。$ apply()时,$ digest已经在进行中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25148925/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com