3

$承諾:Angular.js resourceProvider返回與給定angular.js服務數據

angular.module('mymodule').factory('Products', ['$resource', 
    function($resource) { 
     return $resource('/path/to/getProducts', {}, { 
      find: { 
       method: 'GET', 
       isArray: false 
      } 
     }); 
    } 
]); 

mymodule控制器我做find查詢:

$scope.findAll = function() { 
    Products.find(function (products) { 
     console.log(Object.keys(products)); 
     // ['prodA', 'prodB', ... , '$promise', '$resolved'] 
     for (var i in products) { 
      if (!products.hasOwnProperty(i)) continue; 
      console.log(products[i].description.someprop); 
      // Got error: Cannot read property 'someprop' of undefined 
      // Trust me: I debug this place. someprop is defined for all items except that two 
     } 
    }); 
}; 

它工作正常,但返回$承諾, $使用數據集解析,這樣我就無法循環訪問我的數據。

角文件says表示Resource實例和集合具有這些附加屬性。但我不明白如何在代碼中控制它。

我在做什麼錯?如何預防它?

回答

8

事實上,當你不使用數組時,它會更復雜一些。

response對象從服務器發回包含:

  • resource對象(數據+ $promise$resolved,這就是你在你的回調得到)
  • 一個config對象(頭時,使用的方法,url等)和一個headers函數
  • 和一個data對象,這就是我們想要的!它只包含數據。

但是,您只能在您的then()中看到response.resource。因此,你需要攔截由服務器發送來獲取數據,而不是響應:

return $resource('/path/to/getProducts', {}, { 
     find: { 
      method: 'GET', 
      isArray: false, 
      interceptor: { 
      response: function(response) { 
       return response.data; 
      } 
      } 
     } 
    }); 

然後在你的控制器:

Products.find().$promise.then(
    function(products){ 
     angular.forEach(products, function(value, index){ 
      console.log(value); 
     }); 
    } 
); 

告訴我,如果這對你的作品。

Plunker Demo

+0

謝謝!這是我需要的 – 2014-10-02 16:55:02

+0

stackoverflow不允許我現在獎勵你的答案,但我會在20小時內完成) – 2014-10-02 16:58:28

+2

不客氣。我也學到了一些東西! – deonclem 2014-10-02 17:01:19

0

資源返回承諾,您可以使用then()從承諾中檢索數據。

Products.find().$promise.then(function (products) { 
    console.log(Object.keys(products)); 
}); 
+0

沒有,$承諾,$解決仍處於'products' – 2014-09-30 13:29:27

+0

他們會的,因爲它會返回一個承諾......你仍然可以遍歷您的收藏。請閱讀[承諾](https://docs.angularjs.org/api/ng/service/$q)。 – 2014-09-30 13:30:14

+0

我有錯誤。如果我循環使用簡單的循環而不是使用ng-repeat,它會影響嗎?用代碼 – 2014-09-30 13:36:48

0

我想你的問題是'isArray:false'。所以你的產品不是一個數組,而是對象。設置'isArray:true',你可以整天迭代(var產品)。

+0

更新了我的問題我的產品不是數組,而是對象,所以我將isArray設置爲false。如果isArray設置爲true,但後端返回對象角度拋出錯誤:[$ resource:badcfg]所以我不能這樣做 – 2014-09-30 14:26:02

0

嘗試做response.toJSON並返回只是你的JSON不含承諾和決心。

data.$promise.then(function(myResponse) { 
    var actualData = myResponse.toJSON(); 
}