【问题标题】:Avoid Infinite digest loops in AngularJS with random content避免 AngularJS 中包含随机内容的无限摘要循环
【发布时间】:2014-06-23 10:17:08
【问题描述】:

我的基本结构是我有一个

<img ng-repeat="img in api.images" src="{{ img.url }}">

api 有一个图像 ID 列表,并且必须进行 HTTP 调用以从服务器获取每个图像 ID 的 URL。但是,这些 URL 具有 HMAC 签名,因为它们过期了,并且每次您发出请求时,此签名都会有所不同。因此,api.get_image_urls 调用在执行时总是会返回不同的东西,本质上

get_image_urls: function() {
    var deferred = $q.defer();
    var that = this;
    $http.post(this.url + "image_urls/", {
      "image_ids": Object.keys(this.images)
    })
    .success(function(data) {
        for (var image_id in data.images) {
          that.images[image_id].url = data.images[image_id];
        }
        deferred.resolve();
    });
    return deferred.promise;
  }

因此触发无限摘要循环,因为网址每次都会更改。避免这种情况的最佳策略是什么?

【问题讨论】:

标签: javascript angularjs infinite-loop


【解决方案1】:

在你的情况下,我会创建一些 pre-builder。每次api.images 更改时都会触发摘要循环。要使其工作,请延迟运行其他进程,假设 5 秒并创建 api.images 的副本。

类似:

  $scope.copyOfImageApi = [];

  // run instant loop every 5 sec 
  var rebuildImages = function() {
        /* ... */

      $scope.api.images = <get promise from service>

      $scope.copyOfImageApi = angular.copy($scope.api.images); 


      $timeout(rebuildImages, 5000); 
    }

 rebuildImages();

之后:

<img ng-repeat="img in copyOfImageApi" src="{{ img.url }}">

在这种情况下,您的数组将每 5 秒更新一次,以防止摘要循环中断。


没有检查语法

【讨论】:

  • 有趣的方法。有没有办法在设定的超时时间内不这样做,但在摘要循环结束时调用那个东西?
  • 我记得ngRepeat 指令手表比较旧值和新值,如果不同 -> 运行附加循环。等等。如果数据变化频繁,angular会抛出digest cycle Exception来防止内存舔
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-01
  • 2022-01-15
相关资源
最近更新 更多