我正在寻找追踪
的讨厌错误的方法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。 通过查看注释
中建议的错误日志找到位置
答案 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
});
这样你就可以更自然地融入角度消化周期。