从摘要周期中删除和恢复范围

时间:2013-01-31 13:50:02

标签: scope angularjs

有没有办法从摘要周期中删除范围?换句话说,暂停/恢复范围摘要周期?

在我的情况下,我已经加载了所有页面,但并非所有页面都可见。所以我想暂停那些不可见的,以避免无用的处理。我不想使用ng-view + $route,我不想/需要深层链接。

我看到this thread并抵达this fiddle。它可能完成了工作,但它非常具有侵略性,并且不是非常适合框架更新。

还有其他解决方案,例如$scope.suspend()scope.resume()吗?或者是一个侵入性较小的(从框架角度来看)?我目前正在考虑$destroy$compile周期。

2 个答案:

答案 0 :(得分:12)

我遇到了同样的问题,我找到了一个有趣的解决方案,它不会干扰(太多)AngularJS。将其添加到要禁用的范围:

var watchers;

scope.$on('suspend', function () {
  watchers = scope.$$watchers;
  scope.$$watchers = [];
});

scope.$on('resume', function () {
  scope.$$watchers = watchers;
  watchers = null;
});

然后,您可以使用scope.$broadcast('suspend')禁用范围及其子项,并使用scope.$broadcast('resume')将其恢复。

答案 1 :(得分:3)

正如今天的框架所示,没有方法可以暂停/恢复范围上的摘要。说到这里,有几种技术可以用来限制作为摘要周期的一部分执行的手表数量。

首先,如果屏幕的某些部分被隐藏,您可以使用ng-switch指令系列,从而完全从DOM中删除不可见的部分。

其次,如果通过$apply从您的指令触发摘要周期,并且您希望将监视重新评估限制为子范围,则可以调用$digest而不是$apply

然后,是的,人们可以破坏并重新创建范围,如您所链接的讨论中所述。但是,如果你已经隐藏了部分DOM,那么听起来ng-switch可能是更好的选择。