2014-10-19 33 views
29

我需要從rest API獲取數據,產品id是url的一部分(而不是查詢參數)。

工廠:

.factory('Products', ['$resource', 
    function($resource) { 
     return $resource('products/:productId', { 
      productId: '@id' 
     }, { 
      query: { 
       isArray: false 
      }, 
      update: { 
       method: 'PUT' 
      } 
     }); 
    } 
]) 

控制器:

$scope.getProduct = function(id, from) { 
    $scope.product = Products.get({ id: id }, function(){ 
     console.log($scope.product); 
    }); 
} 

我的網址構建這樣的:

/products?id=5426ced88b49d2e402402205 

代替:

/products/5426ced88b49d2e402402205 

任何想法爲什麼?

回答

54

當您在控制器中調用Products.get()時,您沒有使用正確的參數名稱(根據您對$resource的定義,您需要使用「productId」而不是「id」)。嘗試調用它像這個:

Products.get({ productId: id }) 

以下是這解釋它是如何工作的documentation for $resource片段:

參數對象中每個鍵值第一次綁定到URL模板如果存在的話,然後任何多餘的鍵都會在?之後追加到url搜索查詢中。

在你的情況下,它沒有找到「id」作爲URL中的參數,所以它將它添加到查詢字符串中。

+1

非常感謝,這就是它! :) – orszaczky 2014-10-19 17:16:56

+6

那麼'@'前綴值的目的是什麼呢? 「如果參數值以@爲前綴,那麼該參數的值將從'data'對象的相應屬性中提取(在調用操作方法時提供)例如,如果'defaultParam'對象是'{someParam :'@someProp'}'那麼'someParam'的值將是'data.someProp'。「聽起來你應該能夠傳遞一個'id'值,資源會用它來填充'productId'參數。但這種情況並非如此。 – 2015-11-13 21:42:18

+0

謝謝!今天幫助我! – 2016-01-13 21:14:41

相關問題