从$ resource获取数据时,AngularJS forEach无法正常工作

时间:2013-10-19 09:03:18

标签: angularjs foreach

我对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的其他方式也将受到赞赏。

3 个答案:

答案 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);        
  });
});