找到`$ apply`或`$ digest`调用者

时间:2016-12-19 06:58:53

标签: angularjs angular-digest

我正在寻找追踪

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

我没有使用反模式并且检查我的代码库是否适用于嵌套的apply / digest。我很熟悉。

问题在于第三方插件,在这种情况下是FormEditor和Flatpickr。我将FlatPickr(带有角度附加组件)嵌套到formEditor cshtml文件中,这给了我一个麻烦的错误。

有没有办法跟踪项目中存在的所有应用和/或摘要调用的位置?

或者有没有人有使用flatPickr和flatpickr angular add-on的formEditor解决方案?

FormEditor:https://github.com/kjac/FormEditor FlatPickr:https://github.com/chmln/flatpickr FlatPickr插件:https://www.npmjs.com/package/angular-flatpickr

  

解:   问题是由eventListener调用的$ apply,它将apply注入正在运行的apply / digest。在标记为正确的答案中建议使用$ timeout。   通过查看注释

中建议的错误日志找到位置

1 个答案:

答案 0 :(得分:1)

AngularJS在许多情况下会自动触发$ digest循环(例如在触发ng-click之后),因此解决方案不是找到所有" apply / digest"在您的代码中,因为它不会帮助您防止此错误。

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

一种方法是使用安全检查包装$ apply call:

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

这种方法存在的问题是,有时你的代码不会被调用。

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

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

这样你就可以更自然地融入角度消化周期。