Angular$http会导致带有此错误消息的无限循环.错误:达到10$digest()迭代.正在中止



我遇到了一个问题Angular$http promise。$http promise似乎导致了带有此错误消息的无限循环。错误:达到10$digest()迭代。正在中止!

我想听听建议。

FYI,最后,Collection从API获取数据,创建userModel并将userModel发送到Controller。

我想创建一些功能来组织模型,比如RubyonRails 中的ActiveRecord::Collection

感谢您阅读

//*********************************
// Service from where $http is called
//**********************************
angular.module('dashboardApp').service('UserCollection', ['$http', '$q', function($http, $q){   
    function all(){
      var deferred = $q.defer();
      function successRequest(data) {
        deferred.resolve(data.data);
      };
      function failRequest() {
        deferred.reject([]);
      };
      $http({
        method: 'GET',
        url: 'http://localhost:3000/api/users'
      }).then(successRequest, failRequest);
      return deferred.promise;
    }
    return {
      all: all
    };
}]);
// ************************
// Contoller
// ************************
angular.module('dashboardApp')
  .controller('UserCtrl',['UserCollection', '$q', function(UserCollection, $q) {
   console.log("Inside User Controller");

   var user = this;
   var deferred = $q.defer();
   function successRequest(data){
     var array = deferred.resolve(data.data);
     return array;
   }
   function failRequest(){
     deferred.reject([]);
   }
   user.index = function(){
     UserCollection.all().then(successRequest, failRequest);
   };
  }]);
 //**************
 // View
 //**************
 <div ng-repeat="u in user.index()">
 </div>

幸运的是,你不是唯一一个有这个问题的人。看看这个:https://github.com/angular/angular.js/issues/705.这解决了我的问题,希望它也适用于你。这是因为ng重复中的函数不断更新值,这导致了一个无限的摘要循环。

尝试将promise的结果保存到一个变量中,以便循环使用。

Igor-Minar:getter不是幂等的,它会改变模型(每次调用它时都会生成一个新数组)。

您不应该在UserCtrl的successRequest(data)中使用return array。还要做这个user.index=函数(){UserCollection.all().then(successRequest,failRequest);};

没有多大意义。相反,你应该这样做:

 UserCollection.all().then(successRequest, failRequest);
 function successRequest(data){
     var array = deferred.resolve(data.data);
     user.index = array;
 }

此外,但我不确定您想要实现什么,但我想您不再需要UserCtrl中的延迟对象了。或者你在用它做什么?

简单地说,如果在计算in之后的表达式时ng-repeat总是得到不同的值(在您的情况下是user.index()),就会发生此错误。

您应该像scope.values = ...array;一样保存一次结果,然后像u in values一样在模板中使用。

每次在摘要循环期间调用watch函数时,都会调用ng-repeat中使用的函数,以获取当前模型值,以便与旧模型值进行比较。在您的实现中,user.index总是返回一个新对象(由'then'方法返回的promise对象),这使得Angular认为要重复的模型总是脏的。这篇文章给出了更详细的解释。

最新更新