AngularJS - 由于promise对象而产生的无限循环

时间:2013-01-21 06:23:43

标签: angularjs promise

我是AngularJS的新手,所以这实际上可能指向一些我尚未完全理解的核心概念。我正试图使用​​$q& amp;处理“远程数据”,如本地数据。 promise个对象。直到没有提取远程数据的时间,promise对象无法解析,但一旦解析,我希望视图中的所有依赖数据绑定都得到更新。但是,以下方法导致无限循环,其中remote_total被重复调用,即使之前调用remote_total导致已解析的promise对象。

以下是我的观点

<div ng-controller="MyController">
  {{ remote_total() }}
</div>

以下是控制器的相关摘录:

function MyController($scope, $q, $http) {
  $scope.remote_total = function() {
    var def = $q.defer();
    $http.get('/my/remote/service.json').success(function(data) {
      def.resolve(data);
    });
    return def.promise;
  }
}

首先,如果有人能够向我解释为什么这会进入无限循环会很棒。其次,实现我想要做的最好的方法是什么?

1 个答案:

答案 0 :(得分:3)

Angular执行脏检查以实现双向绑定。在每个循环中,它存储要监视的属性的先前值,并将其与新值进行比较。如果该属性是函数,则调用它并对结果进行比较。

你确实放了一个要监视的函数,在每个循环中,你的函数被调用,因此导致了http请求。

您要做的是自己创建承诺,并将该承诺附加到观看范围(或在视图中显示)。

此外,$ http服务已经返回一个承诺,您不需要创建另一个承诺。

function MyController($scope, $q, $http) {
  $scope.getRemoteTotal = function() {
    var def = $http.get('/my/remote/service.json').then(function(response) {
      $scope.remoteTotal = response.data;
    });
  }
  $scope.getRemoteTotal();
}

<div ng-controller="MyController">
  {{ remoteTotal }}
</div>