查找“$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 摘要循环。
我正在寻找追踪
的讨厌错误的方法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 摘要循环。