2

我对 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 大括号内没有做任何事情。我很感谢任何建议。也将不胜感激获取 id 的替代方法。

4

3 回答 3

1

您遇到的问题显然是 $ressource() 总是返回一个承诺。

这意味着,它是对您的服务器的异步调用,它会在将来的某个时间返回。

您从 $ressource() 获得的同步返回值是一个承诺对象,当 http 请求完成时,它将在未来获得结果。

在当前稳定版本的 angularJS (1.0.x) 中,模板中引用的所有 Promise 都将自动解析,一旦解析,浏览器将显示它。(这将在 angularJS 1.2 中改变)

但是,您的 $scope.getIds 函数可以在 $ressource 承诺解决之前调用,并且 angular.each 不能与承诺对象一起使用。

顺便说一句:Maxim 的第二个建议很有问题,因为它包含难以调试的时序问题。该服务在第一次由 angularJS 解析时发出 $ressource() 调用。在调用 factory.query() 时,可以完成 $ressource() 调用......与否,它不能保证它已经完成!

我会将您的原始代码更改为此(在您的控制器中的某处):

Services.query().then(function(result) {
   $scope.ServiceResult = result;
   angular.forEach(result, function(eachService) {
       console.log(eachService.id);        
   });
});
于 2013-10-20T09:17:04.287 回答
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");
                        });

Promise代表一个未来值,通常是异步操作的未来结果,并允许我们定义一旦该值可用或发生错误时会发生什么。

Fiddle这是可以帮助您的Demo

如果$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

于 2013-10-19T09:11:15.937 回答
0

在 AngularJS 1.5 中,该.query()函数不直接返回一个 Promise。你需要打电话

Services.query().$promise.then(function(result) {
  angular.forEach(result, function(eachService) {
    console.log(eachService.id);        
  });
});
于 2016-06-15T01:04:34.270 回答