2013-10-19 51 views
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的方法將不勝感激。

+0

'$ resource('/ CIS/webresources/service /')'包含什麼? –

回答

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"); 
         }); 

A 承諾表示未來值,通常是異步操作的未來結果,並允許我們定義一旦此值變爲可用或發生錯誤時會發生什麼。

這裏是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

+0

感謝您的快速回復。第二個建議似乎以某種方式工作,但我無法通過eachService.id獲取ID。所以這是我的第一個新問題。第二個問題是我也通過使用ng-repeat來顯示服務,這不再起作用。我想這是因爲現在我正在返回'工廠'而不是'數據'。 – pepper333

+0

嘗試修改我發佈的小提琴以滿足您的需求,以幫助我來幫助您:)。順便說一句,我建議你調試它檢查'eachService'返回什麼 –

+0

你可以發佈''/ CIS/webresources/service /''內容嗎? –

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);   
    }); 
}); 
0

在AngularJS 1.5中,.query()函數不直接返回一個承諾。您需要致電

Services.query().$promise.then(function(result) { 
    angular.forEach(result, function(eachService) { 
    console.log(eachService.id);   
    }); 
});