【问题标题】:Angular $http causes infinite loop with this error message. error : 10 $digest() iterations reached. AbortingAngular $http 会导致此错误消息无限循环。错误:达到 10 次 $digest() 迭代。中止
【发布时间】:2016-08-05 02:36:51
【问题描述】:

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

我想听听一些建议。

仅供参考, 最终,Collection 从 API 获取数据并创建 userModel 并将 UserModel 发送到 Controller。

我想创建功能来组织模型,例如在 Ruby on Rails 中的 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>

【问题讨论】:

    标签: angularjs


    【解决方案1】:

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

    尝试将 promise 的结果保存到可以循环的变量中。

    Igor Minar:您的 getter 不是幂等的并且会更改模型(通过每次调用它时生成一个新数组)。

    【讨论】:

    • 感谢您的评论。人们(像我一样)认为它像 jquery ajax 调用一样简单,但事实并非如此。 :(
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 感谢您的回答。这确实有道理。我完全解决了这个问题。我删除了一个额外的延迟对象。
    【解决方案3】:

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

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

    【讨论】:

    • 感谢您的评论。现在我明白并解决了这个问题!
    • 我很想投票,但我收到了这条消息“感谢您的反馈!一旦您总共获得 15 名声望,您的投票将改变公开显示的帖子分数。”
    【解决方案4】:

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

    【讨论】:

    • 感谢您的评论。现在我明白了并解决了。
    猜你喜欢
    • 2015-05-30
    • 2016-11-15
    • 2012-11-30
    • 1970-01-01
    • 2015-05-07
    • 2013-11-10
    • 1970-01-01
    • 1970-01-01
    • 2015-12-15
    相关资源
    最近更新 更多