有没有办法从摘要周期中删除范围?换句话说,暂停/恢复范围摘要周期?
在我的情况下,我已经加载了所有页面,但并非所有页面都可见。所以我想暂停那些不可见的,以避免无用的处理。我不想使用ng-view + $route
,我不想/需要深层链接。
我看到this thread并抵达this fiddle。它可能完成了工作,但它非常具有侵略性,并且不是非常适合框架更新。
还有其他解决方案,例如$scope.suspend()
和scope.resume()
吗?或者是一个侵入性较小的(从框架角度来看)?我目前正在考虑$destroy
和$compile
周期。
答案 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
可能是更好的选择。