我正在构建一个由Node.js / Mongodb应用程序支持的Angular应用程序。
创建资源时,Mongodb会生成每个资源的id
。
在我POST
我的新对象从工厂发送到服务器之后,服务器返回一个201
响应代码,其中一个位置标头设置为新资源的URI。如何处理响应,然后使用正确的id
?
angular.module('myApp.Todoservices',['ngResource']).
factory('Todo',function($resource){
return $resource('http://localhost\\:3000/todos/:id', {id:'@_id'}, {
getAll: {method:'GET', isArray:true},
update : {method:'PUT'},
create : {method:'POST'},
delete : {method:'DELETE'}
});
});
答案 0 :(得分:1)
如前所述,$resource
不支持此功能,我不知道原因。但是,这是我的解决方法。
var tmpPart = new MyResource({name: $scope.item.name});
tmpPart.$create(function(_tmpPart, responseHeaders){
$resource(responseHeaders("Location")).get(function(tempResourceObject){
$scope.myResourceObjects.push(new MyResource(tempResourceObject))
});
});
new MyResource(tempResourceObject)
是资源对象的新实例,您可以随意使用它。
答案 1 :(得分:1)
您可以使用自定义覆盖默认的$ resource服务。 抱歉coffeescript和ng-classify
class Resource extends Factory
constructor: ($resource, $http) ->
return class ResourceFactory extends $resource
constructor: (url, paramDefaults, actions, options)->
class Res extends super
$save: (params, success, error)=>
super(
params
, (response, responseHeaders)=>
if location = responseHeaders("Location")
$http
.get(location)
.then (httpResponse)->
success new Res httpResponse.data, responseHeaders
, error
else
success response, responseHeaders
, error
)
return Res
之后
Users = Resource '/users'
user = new Users name:'foo'
user.$save (savedUser)->
savedUser # will be created from data loaded from location header of post response
答案 2 :(得分:0)
$ resource service是底层$ http服务的高级包装器。
$ resource方法(post()
,put()
,get()
,...)的成功和错误回调会收到一个包含headers()
方法的响应对象。
使用此方法,您可以获取所有响应标头的数组,或者,如果您提供特定标头名称作为参数,则获取特定标头值:
var successCallback = function(response){
var location = response.headers('location');
// extract resource ID form the location header here...
}
$scope.todo.post(data, successCallback);
$ http header getter函数在$http docs
中描述答案 3 :(得分:0)
看起来$ resource(仍然)不支持[1],所以现在使用$ http [2]服务。
[1] https://github.com/angular/angular.js/issues/7037
[2] http://docs.angularjs.org/api/ng/service/ $ http
答案 4 :(得分:0)
我正在使用“angular-resource”:“1.3.11”,看起来很简单。根据Angular资源文档:
类对象或实例对象上的操作方法可以是 使用以下参数调用:
HTTP GET“class”操作:Resource.action([parameters],[success], [错误])
非GET“类”操作:Resource.action([参数], postData,[success],[error])
非GET实例操作: 实例。$ action([参数],[成功],[错误])
成功回调是 用(value,responseHeaders)参数调用。
使用(httpResponse)参数调用错误回调。
todo.save(postData,
function (value, responseHeaders) {
$scope.id = responseHeaders('Location').split('/').pop();
}
);