【问题标题】:AngularJS: Can you get a 'digest in progress' error from multiple $scope.$apply() calls?AngularJS:你能从多个 $scope.$apply() 调用中得到一个“正在进行中的摘要”错误吗?
【发布时间】:2013-08-28 03:14:07
【问题描述】:

在您可能拥有较大范围的大型应用程序中,如果您快速连续多次调用$scope.$apply,您会收到“范围已在进行中”错误吗?

例如,我有一个链接到 bootstrap switch 插件的指令。该指令仅显示一个开/关开关,用户可以单击该开关将布尔值切换为真/假。每次用户单击此按钮时,我的指令都会执行$scope.$apply(),其中更改一个范围变量以反映开关的新状态(打开或关闭)。

我担心如果用户快速连续点击开关,我可能会收到“正在消化”错误。然而,情况并非如此,每次事情进展得非常顺利,并且尽管触发了多个$scope.$apply() 调用,但范围值会立即在各处更新。

这是因为$scope.$apply 以某种方式进行了优化,因此它不会运行完整的摘要,而只会更新那些已更改的值,还是只是因为我的范围目前相对较小,所以完整的摘要不是'运行时间不长吗?

【问题讨论】:

  • 您几乎不需要调用 $scope.$apply。如果您提供示例,我相信我们可以提供帮助。
  • @ZackArgyle 我确实在问题中举了一个例子,基本上是引导开关的指令,每次用户单击开关时,它都会触发对 $scope.$apply 的调用以更新更改变量
  • 哦,我真的不认为有人会比摘要循环更快地点击。试试看,看看能不能点击够快!
  • @ZackArgyle 没错,我不能。但周期会一直保持这么快,还是会随着范围变大而减慢?
  • @click-update 如果您想更加确定,请设置一个像这个家伙这样的安全应用功能。 Angular Safe Apply

标签: javascript angularjs


【解决方案1】:

Javascript 是单线程的。每次调用 $apply() 都会同步运行。获得该错误的唯一方法是从已在 Angular 上下文中调用的函数中调用 $apply()。

我有多个大块的显示/隐藏块的数组,没有问题。 Javascript 和 Angular 进行了相当优化。

【讨论】:

  • 如果每次调用$scope.$apply 都是由用户点击触发的,会发生什么?如果用户连续快速点击一个元素,会不会导致多次调用?
  • 之前的每个 $scope.$apply 在浏览器接受点击之前都会被清除,所以如果它们是基于用户交互的,你会没事的。唯一会遇到麻烦的情况是,如果你在一个角度 $scope.$apply 中运行了一些东西,它再次调用了 $scope.$apply。如果您遇到这种情况,请将您的操作放入 $timeout() 中,如 here 所述。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-14
  • 2012-09-27
  • 1970-01-01
  • 2015-08-22
  • 1970-01-01
  • 2014-07-27
  • 1970-01-01
相关资源
最近更新 更多