2015-07-29 6 views
7

Ich habe eine AngularJS $ resource:

$resource("http://localhost:3000/:id",{ 
    id: '@id' 
}, 
{ 
    get: { 
     method:'GET', 
     isArray: false 
    }, 
    foo: { 
     method:'POST', 
     url: 'http://localhost:3000/:id/foo', 
     isArray: false 
    } 
}); 

Nun, wenn ich rufe:

User.foo({id:'123', anotherParam: 'bar'}); 

Dies führt in der URL 'http://localhost:3000/foo' genannt wird, und das Bestehen der ID und anotherParam-Parameter als POST-Felder.

Ich möchte es tatsächlich "http://localhost:3000/123/foo" aufrufen und nur den Parameter anotherParam als ein POST-Feld übergeben.

Wie bekomme ich den ID-Parameter korrekt zu verhalten?

Antwort

14

https://docs.angularjs.org/api/ngResource/service/$resource

Nicht-GET "Klasse" Aktionen: Resource.action ([Parameter], postdata [Erfolg], [Fehler])

Sie tun müssen:

User.foo({id:'123', anotherParam: 'bar'}, <post data object>); 

Wenn Sie die Funktion mit einem einzigen Argument aufrufen. Es nimmt an, dass das optionale Argument nicht vorhanden ist und sendet es als postData.

1

Die akzeptierte Lösung funktionierte nicht für mich (AngularJS v1.4.8). Muss den Inhaltstyp manuell festlegen und in Daten transformieren.

Probe:

var DirectoryApi = $resource('api/directories', null, { 
    move: { 
     url: 'api/directories/:name/_move', 
     params: {"name" : "@name"}, 
     headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'}, 
     transformRequest: function (param) { 
      return $.param(param); 
     }, 
     method: 'POST' 
    }, 
}); 

Und Nutzung:

function moveDirectory(name, parent, after) { 
    return DirectoryApi.move({name: name}, {parent: parent, after: after}); 
}