2013-10-22 13 views
21

Załóżmy, że mam zasób skonfigurować tak:Jak nie przesłać parametrów szablonu adresu URL z ciałem żądania w kanoncie?

resource = $resource(
    "http://foo.com/service/:type/:id", 
    {}, 
    {save: {method:'PUT', params: {type:'@type', id: '@id'}}} 
); 
resource.save({type:'user', id:14, name:'Bob Dole'}); 

Czy jest jakiś sposób mogę zapobiec type i id przed przedłożone jako część ciała żądanie, i po prostu wysłać name w zawartości umieścić? Nie kontroluję interfejsu API, który przesyłam, i wydaje się, że nie podoba mi się dodatkowe parametry, które wysyłam.

Dzięki!

Aktualizacja - 25.10.13 - 13:38

Dokumentacja resource mówi tak:

Jeśli wartość parametru jest poprzedzona @ wówczas wartość tego parametru jest pobierany z obiektu danych (przydatne w przypadku operacji innych niż GET).

Oznacza to, że powinien usunąć parametrów z danymi:

resource.save({type:'@user', id:'@14', name:'Bob Dole'}); 

ale nie wydają się działać. Wciąż ze stratą.

+0

To spora domena; ale przy użyciu $ HTTP; możesz dodać funkcję transformacji, aby zmodyfikować żądanie. Czy możesz zrobić to samo z $ resource? – JeffryHouser

+0

Dzięki - to działa! Zobacz wyżej dla mojego rozwiązania. Jednak dokumenty wspominają o łatwiejszym sposobie, który powinien zadziałać, ale nie działa. –

+0

Powinieneś opublikować swoje rozwiązanie jako formalną odpowiedź [AKA Odpowiedz na własne pytanie]. Pomoże to ludziom, którzy odnajdą się w przyszłości. – JeffryHouser

Odpowiedz

7

FWIW, znalazłem obejście, dzięki @ Reboog711 poprzez włączenie parametru transformRequest tak:

resource = $resource(
    "http://foo.com/service/:type/:id", 
    {}, 
    {save: { 
     method:'PUT', 
     transformRequest:function(data) { 
      delete data.type; 
      delete data.id; 
      return JSON.stringify(data); 
     }, 
     params: {type:'@type', id: '@id'} 
    }} 
); 
32

Używaj pierwszy parametr dla parametrów szablonu URL i umieścić swoje dane stanowisko w drugim parametrze tak:

resource.save({id:14, type:'user'}, {name:'Bob Dole'}); 

Oto linia z Angular docs który pokazuje podpis funkcję:

non-GET "klasa" AC ia: Resource.action ([parametry], postData [sukces], [Błąd])

Oto przykład w plunker

Żądanie można dostać nie posiada parametrów URL w organizmie:

Request URL:http://run.plnkr.co/JAOqZqW6RSywatUM/badUrl/user/14 
Request Method:PUT 
Request Payloadview source 
{name:Bob Dole} 
+4

To jest poprawna odpowiedź. – marapet