2015-07-29 4 views
7

У меня есть angularJS $ ресурс:

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

Теперь, если я позвоню:

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

Это приводит к URL 'http://localhost:3000/foo' который вызывается и прохождение id и anotherParam как поля POST.

Я на самом деле хочу, чтобы он назывался «http://localhost:3000/123/foo» и передал только параметр anotherParam как поле POST.

Как заставить параметр id правильно вести себя?

ответ

14

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

не-ГЭТ "класса" действия: Resource.action ([параметры], PostData, [успех], [ошибка])

Вам нужно сделать:

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

Когда вы вызываете функцию одним аргументом. Он предполагает, что необязательный аргумент отсутствует и отправляет его как postData.

1

Принятое решение не работает для меня (AngularJS v1.4.8). Необходимо вручную задать тип контента и преобразовать его для формирования данных.

Пример:

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' 
    }, 
}); 

И использование:

function moveDirectory(name, parent, after) { 
    return DirectoryApi.move({name: name}, {parent: parent, after: after}); 
} 
Смежные вопросы