我曾遇到同样的问题,并找到了一个有趣的解决方案,它不会(太多地)干扰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')
重新启用。
目前该框架没有暂停/恢复作用域中的脏检查方法。尽管如此,有几种技术可用于限制在脏检查循环中执行的监视器数量。
首先,如果屏幕的某些部分无论如何都被隐藏,您可以使用ng-switch系列指令,从而完全从DOM中删除不可见的部分。
其次,如果您的指令通过$apply
触发了脏检查循环,并且希望将监视器重新评估限制为子作用域,则可以调用$digest
而不是$apply
。
然后,是的,可以像您链接到的讨论中描述的那样销毁和重新创建作用域。但是,如果您已经隐藏了DOM的某些部分,那么使用ng-switch
可能是更好的选择。
ng-switch
对于这种情况确实是一个可考虑的选项。但是你不认为有人使用非 Angular 代码希望在不让 ng-switch
控制操作的情况下暂停 DOM 的某个部分更新是合理的吗?我们当然可以模仿 ng-switch
的行为,但似乎这是大型混合项目性能调优的关键特性。此外,也许有一种方法只运行 ng-bind
观察,防止其它观察运行。不知道...请分享您的想法。 - Caio Cunha
$scope.$watch
,因为在禁用时可能会添加新的观察者。 - Caio Cunha