Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 包装$resource请求不返回POST数据_Javascript_Rest_Angularjs - Fatal编程技术网

Javascript 包装$resource请求不返回POST数据

Javascript 包装$resource请求不返回POST数据,javascript,rest,angularjs,Javascript,Rest,Angularjs,我正在用一个简单的包装器包装我的$resource请求。主旨 就是能够在发出请求之前添加一些逻辑。我一直在关注作者写的那篇好文章 在这里,您可以看到访问RESTAPI模块的服务定义 resources.factory('Device', ['RequestWrapper', '$resource', 'lelylan.config', function(RequestWrapper, $http, config) { var resource = $resource(config.endpo

我正在用一个简单的包装器包装我的$resource请求。主旨 就是能够在发出请求之前添加一些逻辑。我一直在关注作者写的那篇好文章

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

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;
}]);
如果我使用$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);
为什么??快速的答案是因为在角度资源的源代码中他们使用了它。实际上#call运行函数,将其发送给调用对象。它通常用于初始化对象

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