12

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

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

我看到了这个线程并到达了这个小提琴。它可能会起作用,但它非常具有侵入性,而且对框架更新不太友好。

有没有其他解决方案,比如 a$scope.suspend()scope.resume()?还是侵入性较小的(从框架的角度来看)?我目前正在考虑$destroy$compile循环。

4

2 回答 2

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').

于 2013-07-26T11:43:38.017 回答
3

就今天的框架而言,没有方法可以在范围上暂停/恢复摘要。话虽如此,有几种技术可以用来限制作为摘要周期的一部分执行的手表数量。

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

其次,如果从您的指令通过触发摘要循环,$apply并且您希望将手表重新评估限制在子范围内,您可以调用$digest而不是$apply.

然后,是的,可以按照您链接到的讨论中的描述销毁并重新创建范围。但是,如果您已经隐藏了 DOM 的一部分,这听起来ng-switch可能是一个更好的选择。

于 2013-01-31T18:15:37.820 回答