在摘要循环中,对变量进行脏检查,即是否有100个范围变量,并且如果我更改一个变量,则它将监视所有变量。
假设我有100个彼此独立的范围模型变量。如果我对一个变量进行了更改,那么我不想检查所有其他99个变量。有什么办法吗?如果是,怎么办?
令人惊讶的是,这通常不是问题,即使具有数千个绑定,浏览器也不会出现问题,除非表达式很复杂。常见的答案how many watchers are ok to 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 : //coderwall.com/p/d_aisq/speeding-up-angularjs-s-digest-loop
谢谢。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句