从服务器获取Angular工厂中新创建的资源的ID

时间:2013-06-22 19:53:03

标签: javascript mongodb rest angularjs

我正在构建一个由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'}
    });
});

5 个答案:

答案 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();
       }
);