令人惊讶的是,这通常不是问题,即使具有数千个绑定,浏览器也不会出现问题,除非表达式很复杂。的常见答案 how many watchers are okto have
是 2000
。
解决方案:
从开始
AngularJS 1.3,这很容易,因为
one-time绑定现在处于核心地位。
- 一次绑定变量。
我们可以使用一次绑定
(::)指令来防止观察者观察到不需要的变量。在这里,变量将仅被监视一次,之后将不更新该变量。
- 手动停止摘要循环。
HTML:
<ul ng-controller="myCtrl"> <li ng-repeat="item in Lists">{{lots of bindings}}</li></ul>控制器代码:
app.controller('myCtrl', function ($scope, $element) { $element.on('scroll', function () { $scope.Lists = getVisibleElements(); $scope.$digest(); });});在期间 $digest
,您仅对
Lists对象的更改感兴趣,而对单个项目的更改不感兴趣。但是,Angular仍会询问每个观察者是否有更改。
指令stop
和pause
摘要:
app.directive('stopDigest', function () { return { link: function (scope) { var watchers; scope.$on('stop', function () { watchers = scope.$$watchers; scope.$$watchers = []; }); scope.$on('resume', function () { if (watchers) scope.$$watchers = watchers; }); } };});现在,应该更改控制器代码:
<ul ng-controller="listCtrl"> <li stop-digest ng-repeat="item in visibleList">{{lots of bindings}}</li></ul>app.controller('myCtrl', function ($scope, $element) { $element.on('scroll', function () { $scope.visibleList = getVisibleElements(); $scope.$broadcast('stop'); $scope.$digest(); $scope.$broadcast('resume'); });});参考文档: https : //prerwall.com/p/d_aisq/speeding-up-angularjs-s-digest-
loop
谢谢。



