查找“$apply”或“$digest”调用程序

Find `$apply` or `$digest` invoker

我正在寻找追踪

的讨厌错误的方法
apply/digest is already in progress

我比较熟悉不使用反模式,并检查了我的代码库是否有嵌套应用's/digest。

问题在于第三方插件,在本例中为 FormEditor 和 Flatpickr。我已将 FlatPickr(带有 angular 附加组件)嵌套到 formEditor cshtml 文件中,这给了我一个讨厌的错误。

有没有办法跟踪我的项目中出现的所有应用 and/or 摘要调用的位置?

或者有没有人有使用 flatPickr 和 flatpickr angular 附加组件的 formEditor 的解决方案?

表单编辑器:https://github.com/kjac/FormEditor FlatPickr: https://github.com/chmln/flatpickr FlatPickr add-on: https://www.npmjs.com/package/angular-flatpickr

SOLUTION: The problem was a $apply called by an eventListener which injected the apply into the running apply/digest. Used $timeout as suggested in the answer marked as correct. The location was found by looking into the error log as suggested in comments

AngularJS 在许多情况下会自动触发一个 $digest 循环(例如在 ng-click 触发之后)所以解决方案不是在你的代码中找到所有 "apply / digest" 因为它不会帮你避免这个错误。

正确的方法是控制第 3 方对 $apply 方法的调用。

一种方法可以通过安全检查包装 $apply 调用:

if(!$scope.$$phase) {
  // place 3rd party updates to scope here
  $scope.$apply();
}

这个方法的问题是有时你的代码不会被调用。

更好的方法是用 $timeout 0 包装它:

$timeout(function(){
  // place 3rd party updates to scope here 
});

这样您就可以更自然地融入 angular 摘要循环。