我对AngularJs forEach操作有疑问。我想迭代我的资源服务,保存每个项目的ID。我认为这一定非常容易但不知怎的,我无法弄明白。我最近的方法看起来像这样:
CIS.factory('Services', function($resource) {
return $resource('/CIS/webresources/service/');
});
function ServiceCtrl($scope, Services) {
$scope.ServiceResult = Services.query();
$scope.getIds = function() {
angular.forEach($scope.ServiceResult, function(eachService) {
console.log(eachService.id);
});
};
$scope.getIds();
}
但它没有在forEach括号内做任何事情。我很感激任何建议。获得ids的其他方式也将受到赞赏。
答案 0 :(得分:1)
声音如$scope.ServiceResult
返回承诺,您之前运行forEach
,实际上是获取数据。另一个问题应该是query()
方法根本不返回任何内容。
所以我们会尝试两种选择:
如果$resource('/CIS/webresources/service/')
为异步:
尝试更改工厂并调用方法,如:
CIS.factory('Services', ['$resource','$q', function($resource, $q) {
var data = $resource('/CIS/webresources/service/');
var factory = {
query: function () {
var deferred = $q.defer();
deferred.resolve(data);
return deferred.promise;
}
}
return factory;
}]);
并在控制器中调用它:
Services.query() // query() returns promise
.then(function (result) {
angular.forEach(result, function(eachService) {
console.log(eachService.id);
});
}, function (result) {
alert("Error: No data returned");
});
承诺表示未来值,通常是异步操作的未来结果,并允许我们定义一旦该值可用或发生错误时将发生什么。
以下是 Fiddle 中可以帮助您的演示
如果$resource('/CIS/webresources/service/')
不是异步:
CIS.factory('Services', ['$resource','$q', function($resource, $q) {
var data = $resource('/CIS/webresources/service/');
var factory = {
query: function () {
return data;
}
}
return factory;
}]);
和控制器(和你一样):
$scope.ServiceResult = Services.query();
$scope.getIds = function() {
angular.forEach($scope.ServiceResult, function(eachService) {
console.log(eachService.id);
});
};
相关示例: Fiddle
答案 1 :(得分:1)
你遇到的问题显然是$ ressource()总是返回一个promise。
这意味着,它是对您的服务器的异步调用,将在某个时间返回。
从$ ressource()获得的同步返回值是一个promise对象,当http请求完成后,将在以后获取结果。
在angularJS(1.0.x)的当前稳定版本中,模板中引用的所有承诺将自动解析,浏览器将在解析后显示。 (这将在angularJS 1.2中改变)
但是,在解析$ ressource promise之前可以调用$ scope.getIds函数,而angular.each不能用于promise对象。
BTW:Maxim提出的第二个建议很成问题,因为它包含一个难以调试的时序问题。该服务在第一次由angularJS解析时发出$ ressource()调用。当调用factory.query()时,$ ressource()调用可以完成......或者不是,它不能保证它已经完成!我会将原始代码更改为此(在控制器中的某个位置):
Services.query().then(function(result) {
$scope.ServiceResult = result;
angular.forEach(result, function(eachService) {
console.log(eachService.id);
});
});
答案 2 :(得分:0)
在AngularJS 1.5中,.query()
函数不直接返回promise。你需要打电话
Services.query().$promise.then(function(result) {
angular.forEach(result, function(eachService) {
console.log(eachService.id);
});
});