2

我正在构建一个由 Node.js/Mongodb 应用程序支持的 Angular 应用程序。

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

在我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'}
    });
});
4

5 回答 5

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),你可以用它做任何你想做的事情。

于 2015-03-21T20:38:31.953 回答
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
于 2015-08-13T19:24:50.690 回答
0

看起来 $resource (仍然)不支持 [1],所以现在使用 $http [2] 服务。

[1] https://github.com/angular/angular.js/issues/7037

[2] http://docs.angularjs.org/api/ng/service/ $http

于 2014-04-08T02:29:46.340 回答
0

$resource 服务是底层 $http 服务的高级包装器。

$resource 方法 ( post(), put(), get(), ...) 的 Success 和 Error 回调接收包含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 文档中描述

于 2013-06-22T21:11:40.073 回答
0

我正在使用“angular-resource”:“1.3.11”,它看起来很简单。根据 Angular 资源文档:

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

HTTP GET“类”操作:Resource.action([parameters], [success], [error])

非 GET “类”操作:Resource.action([parameters], postData, [success], [error])

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

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

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

 todo.save(postData,
       function (value, responseHeaders) {
           $scope.id = responseHeaders('Location').split('/').pop();
       }
);
于 2015-05-25T17:08:47.947 回答