AngularJS Wiki -反模式声明如下:
不要做
if (!$scope.$$phase) $scope.$apply(),这意味着您的$scope.$apply()在调用堆栈中不够高。
我能理解这一点。有一个内置的逻辑,它决定什么时候需要执行。当外部开发人员没有在运行时执行不同过程的直接内部代码时,确定应该在哪里运行时,它会抵消框架的影响。
但我目前正在上传一个大文件,上传进度通过进度栏显示。我使用的库(resumableJS)反过来有一个名为fileProgress的事件,在上传过程中调用该事件。如果在该事件中我什么也不做,那么酒吧就不会更新。如果我将$scope.$apply()放在那里,就会相应地更新条形图,但是我得到摘要和/或已在进行中的应用错误。最后,在$$phase检查的帮助下,我获得了两个方面的优势,一个更新的进度条,没有任何错误。
那么,在不干扰角度处理顺序的同时,让我的酒吧更新的正确选择是什么呢?
发布于 2017-03-21 09:46:59
在您的示例中,当摘要周期已经处于阶段时,您正在尝试运行摘要周期。所以它抛出了一个错误
您可以使用类似于setTimeout(fn,0)的东西。它主要做的是立即向队列中添加新消息,并在当前执行的代码完成后进行处理。
因此,在显式执行$scope.$apply()的角度代码中,将其更改为下面的代码,它应该可以工作。
$timeout(function(){
$scope.$apply();
},0)发布于 2017-03-21 11:02:11
错误:$rootScope:inprog操作已在进行中
在任何时候,只能有一个$digest或$apply操作在进行中。这是为了防止很难检测到错误进入您的应用程序。此错误的堆栈跟踪允许您跟踪当前正在执行的$apply或$digest调用的起源,这将导致错误。
共同原因
除了简单地不正确地调用$apply或$digest之外,在某些情况下,您可能通过自己的错误获得此错误。
不一致API (同步/异步)
在与API交互时经常会看到此错误,API有时是同步的,有时是异步的。
这并不是第三方图书馆的理想设计选择。
要解决这种类型的问题,可以将api固定为始终同步或异步,或者强制您的回调处理程序始终使用$timeout服务异步运行。
function MyController($scope, $timeout, thirdPartyComponent) {
thirdPartyComponent.getData(function(someData) {
$timeout(function() {
$scope.someData = someData;
}, 0);
});
}在这里,我们使用$timeout来安排将来调用堆栈中对作用域的更改。通过提供0ms的超时时间,这将尽快发生,$timeout将确保在单个$apply块中调用代码。
**仅将这一技术作为最后手段**。
最好找到错误的来源并修复它。
有关更多信息,请参阅AngularJS错误引用- $rootScope/inprog -诊断此错误
也看,
https://stackoverflow.com/questions/42923234
复制相似问题