gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 06:36:42 25 4
gpt4 key购买 nike

当摘要循环对变量进行脏检查时,即是否有 100 个作用域变量,并且如果我更改一个变量,那么它将运行所有变量的监视。

假设我有 100 个彼此独立的作用域模型变量。如果我更改一个变量,那么我不想检查所有其他 99 个变量。有什么办法可以做到这一点吗?如果是,怎么做?

最佳答案

令人惊讶的是,这通常不是问题,浏览器即使有数千个绑定(bind)也不会出现问题,除非表达式很复杂。对于可以有多少观察者的常见答案是2000

解决方案:

AngularJS 1.3 开始,这相当容易,因为一次性绑定(bind)现在位于核心中。

  1. 一次性绑定(bind)变量。

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

  • 手动停止摘要周期。
  • HTML:

    <ul ng-controller="myCtrl">
    <li ng-repeat="item in Lists">{{lots of bindings}}</li>
    </ul>

    Controller 代码:

    app.controller('myCtrl', function ($scope, $element) {
    $element.on('scroll', function () {
    $scope.Lists = getVisibleElements();
    $scope.$digest();
    });
    });

    $digest期间,您只对Lists对象的更改感兴趣,而不对单个项目的更改感兴趣。然而,Angular 仍会询问每个观察者是否有变化。

    用于停止暂停摘要的指令:

    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;
    });
    }
    };
    });

    现在,应该更改 Controller 代码:

    <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 - 如何在 angularjs 中手动停止摘要循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38381808/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com