2014-10-19 9 views
29

Ho bisogno di ottenere dati da un'API di riposo, con la parte id prodotto dell'url (e non come parametro di query).

La fabbrica:

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

Il controllore:

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

mio URL è costruito come:

/products?id=5426ced88b49d2e402402205 

invece di:

/products/5426ced88b49d2e402402205 

Qualche idea perché?

risposta

54

Quando si chiama Products.get() nel controller, non si utilizza il nome del parametro corretto (è necessario utilizzare "IDProdotto" anziché "ID" in base alla definizione dello $resource). Prova a chiamare in questo modo invece:

Products.get({ productId: id }) 

Ecco un frammento della documentation for $resource che spiega come funziona:

Ogni valore chiave nell'oggetto parametro è prima destinata a modello url se presente e poi le eventuali chiavi in ​​eccesso vengono aggiunte alla query di ricerca dell'URL dopo il?.

Nel tuo caso, non trova "id" come parametro nell'URL, quindi lo aggiunge alla stringa di query.

+1

Grazie mille, è stato! :) – orszaczky

+6

Quindi qual è lo scopo del valore prefisso '@' allora? "Se il valore del parametro è preceduto da @, il valore per quel parametro verrà estratto dalla proprietà corrispondente sull'oggetto' data' (fornito quando si chiama un metodo di azione). Ad esempio, se l'oggetto 'defaultParam' è' {someParam : '@someProp'} 'allora il valore di' someParam' sarà 'data.someProp'." Sembra che dovresti essere in grado di passare un valore 'id' e la risorsa lo userebbe per popolare il parametro' productId'. Ma questo non è il caso. –

+0

Grazie! Mi ha aiutato oggi! –