当前位置: 首页 > 面试题库 >

如何在angularjs中手动停止摘要循环

韶浩博
2023-03-14
问题内容

在摘要循环中,对变量进行脏检查,即是否有100个范围变量,并且如果我更改一个变量,则它将监视所有变量。

假设我有100个彼此独立的范围模型变量。如果我对一个变量进行了更改,那么我不想检查所有其他99个变量。有什么办法吗?如果是,怎么办?


问题答案:

令人惊讶的是,这通常不是问题,即使具有数千个绑定,浏览器也不会出现问题,除非表达式很复杂。的常见答案 how many watchers are ok to have2000

解决方案:

从开始AngularJS 1.3,这很容易,因为 one-time 绑定现在处于核心地位。

  1. 一次绑定变量。

我们可以使用一次绑定(::)指令来防止观察者观察到不需要的变量。在这里,变量将仅被监视一次,之后将不更新该变量。

  1. 手动停止摘要循环。

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仍会询问每个观察者是否有更改。

指令stoppause摘要:

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(); 在其他内部保持循环运行,所以现在我的问题是一旦我想要[加载完成],如何停止该循环? 问题答案: 返回计时器句柄,您可以使用该句柄停止超时。 因此,例如: 因此,您可以将其用作: 请注意,我没有将其再次调用,而是将其重新设置为。否则,这将行不通。另请注意,我已将超

  • 我有一个程序,它每秒钟响一次,直到停止。问题是,在我按下“开始”并发出嘟嘟声后,我无法单击“停止”按钮,因为窗口冻结。欢迎任何帮助。