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

Cai*_*nha 12 scope angularjs

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

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

我看到了这个线程并且到了这个小提琴.它可能完成了工作,但它非常具有侵略性,并且不是非常适合框架更新.

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

Lau*_*rin 12

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

var watchers;

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

scope.$on('resume', function () {
  scope.$$watchers = watchers;
  watchers = null;
});
Run Code Online (Sandbox Code Playgroud)

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


pko*_*rce 3

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

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

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

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