我遇到了一个问题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认为要重复的模型总是脏的。这篇文章给出了更详细的解释。