2013-06-22 27 views
2

我正在构建一个由Node.js/Mongodb应用程序支持的Angular应用程序。从服务器获取Angular工厂中新创建资源的ID

每个资源的id由Mongodb在创建资源时生成。

之后I 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

后不服务器返回与新创建的记录太(您可以在其中找到新创建的记录的ID )? – callmekatootie

+0

@callmekatootie据我所知,正确的响应是“201 Created”,其中Location头指向新资源。请参阅http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.30。我会编辑我的问题来澄清。 – John

回答

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)是你的资源对象的新实例,你可以做你想做的事情不管。

0

$ resource service是底层$ http服务的高级包装。的$资源方法

成功和错误回调(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头getter函数描述于$http docs

0

我使用“角度资源”:“1.3.11”,它看起来很简单。与角资源文件,根据:

类对象或实例对象上的操作方法可被调用 使用以下参数:

HTTP GET“类”动作:Resource.action([参数] [成功], [错误])

非GET “类” 动作:Resource.action([参数], POSTDATA,[成功],[错误])

非GET实例操作:$ action([parameters],[success],[error])

成功回调是 用(value,responseHeaders)参数调用。

使用(httpResponse)参数调用错误回调。

todo.save(postData, 
     function (value, responseHeaders) { 
      $scope.id = responseHeaders('Location').split('/').pop(); 
     } 
); 
1

您可以自定义一个覆盖默认$资源服务。 抱歉的CoffeeScript和NG-分类

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