包裹角度$resource请求,但不返回POST数据

Wrap angular $resource requests not returning POST data

本文关键字:返回 POST 数据 请求 resource 包裹      更新时间:2023-09-26

我正在用一个简单的包装器包装我的$resource请求。主要观点就是能够在发出请求之前添加一些逻辑。我看过尼尔斯写的那篇漂亮的文章。

在这里,您可以看到访问RESTneneneba API模块的服务定义。

resources.factory('Device', ['RequestWrapper', '$resource', 'lelylan.config', function(RequestWrapper, $http, config) {
  var resource = $resource(config.endpoint + '/devices/:id', { id: '@id' });
  return RequestWrapper.wrap(resource, ['get', 'query', 'save', 'delete']);
}]);

在这里您可以看到请求包装器的定义。

resources.factory('RequestWrapper', ['AccessToken', function(AccessToken) {
  var requestWrapper = {};
  var token;
  requestWrapper.wrap = function(resource, actions) {
    token = AccessToken.initialize();
    var wrappedResource = resource;
    for (var i=0; i < actions.length; i++) { request(wrappedResource, actions[i]); };
    return wrappedResource;
  };
  var request = function(resource, action) {
    resource['_' + action]  = resource[action];
    resource[action] = function(param, data, success, error) {
      (AccessToken.get().access_token) ? setAuthorizationHeader() : deleteAuthorizationHeader()
      return resource['_' + action](param, data, success, error);
    };
  };
  var setAuthorizationHeader = function() {
    $http.defaults.headers.common['Authorization'] = 'Bearer ' + token.access_token;
  };
  var deleteAuthorizationHeader = function() {
    delete $http.defaults.headers.common['Authorization']
  };
  return requestWrapper;
}]);

GET和DELETE方法(不返回一具尸体),但我无法节省工作费用。发生的情况是,当创建的资源返回未添加的资源。我只有我在创建时设置的数据阶段让我举个例子。

在这种情况下,我们使用包装的资源。如果我尝试获取#updated_at属性,我就无法在Chrome检查器中,我可以看到资源是如何成功创建的。

$scope.device = new Device({ name: 'Angular light', type: 'http://localhost:9000/types/50bf5af4d033a95486000002' });
$scope.device.$save(function(){ console.log('Device Wrapped', $scope.device.created_at) });
# => undefined

如果我使用$resource,一切都很好。

// Suppose authorization is already set
var Resource = $resource('http://localhost'':9000/devices/:id');
$scope.resource = new Resource({ name: 'Angular light', type: 'http://localhost:9000/types/50bf5af4d033a95486000002' });
$scope.resource.$save(function(){ console.log('Device Base', $scope.resource.created_at); });
# => 2013-02-09T12:26:01Z

我开始检查angular-resource.js代码,但几个小时后我真的想不出来了它出来了。我不知道为什么返回正文,但在包装器资源中它是不可访问的。

任何想法或帮助都将不胜感激。谢谢

在深入研究AngularJS源代码时,我找到了解决方案。

问题是包装器返回的是一个函数而不是一个对象,这带来了一些问题。解决方案是更改包装中的以下行:

return resource['_' + action](param, data, success, error);

这个:

return resource['_' + action].call(this, params, data, success, error);

为什么?快速的答案是因为在angular resource的源代码中他们使用了它。实际上#call运行了将其发送给调用对象的函数。它通常用于初始化对象。点击此处了解更多信息。