在摘要循环中,对变量进行脏检查,即是否有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
谢谢。
问题内容: 使AngularJS与其他JavaScript-MVC框架区分开的一件事是,它能够使用绑定将JavaScript中的绑定值回传到HTML。当您为$ scope变量分配任何值时,Angular会“自动”执行此操作。 但是,这有多自动化?有时,Angular不会接受更改,因此我需要调用$ scope。$ apply()或$ scope。$ digest()来通知angular来获取更改。有
问题内容: 我可以在AngularJS范围上设置$ watch,以便在我感兴趣的表达式发生更改时得到通知。但是一旦失去兴趣我该如何停止观看? 问题答案: 当调用一个函数时,该函数将取消注册绑定的表达式。 例如,要观看变量仅更改一次: 希望能有所帮助:-)
我有一个存储,它偶尔会根据用户的操作来获取数据。这是一个存储,因为它的数据是全局使用的,并且主要是所有组件都需要可用的最新数据。 但是,对于一个特定的组件,我只需要加载的第一个数据。 对于此组件,没有理由在第一次提取之后保持函数运行。那么,如何才能停止这个订阅功能呢? Svelte Doc的唯一示例使用,但我需要手动停止这个。 我用一个简单的“count”(如果count>1,则取消订阅)尝试了一
问题内容: 我正在编写代码以确定nxn列表中的每个元素是否相同。即返回true,但将返回false。我正在考虑编写一个代码,当它发现与第一个元素不同的元素时立即停止。即: 我想停止此循环, 然后返回false。否则返回true。我将如何实施呢? 问题答案: 使用和为此。可以使用以下命令在Python中完成打破嵌套循环的操作: 另一种方法是将所有内容包装在函数中,并用于从循环中退出。
问题内容: 我试图用图像精灵建立一个加载指示器,然后我想到了这个功能 所以输出看起来像这样 我不得不使用setBgPosition(); 在其他内部保持循环运行,所以现在我的问题是一旦我想要[加载完成],如何停止该循环? 问题答案: 返回计时器句柄,您可以使用该句柄停止超时。 因此,例如: 因此,您可以将其用作: 请注意,我没有将其再次调用,而是将其重新设置为。否则,这将行不通。另请注意,我已将超
我有一个程序,它每秒钟响一次,直到停止。问题是,在我按下“开始”并发出嘟嘟声后,我无法单击“停止”按钮,因为窗口冻结。欢迎任何帮助。