javascript - 包装 Angular $resource 请求不返回 POST 数据

标签 javascript rest angularjs

我正在努力将我的 $resource 请求包装在一个简单的包装器中。主要思想 是能够在发出请求之前添加一些逻辑。我关注了 Nils 写的好文章.

在这里您可以看到用于访问 REST 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 方法(不返回的方法),一切正常 一个 body 似乎),但我无法让 $save 工作。发生的情况是,当 JSON 的 创建的资源返回未添加。我只有我在创作时设置的数据 阶段。让我举个例子。

在本例中,我们使用包装的资源。如果我尝试获取 #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 运行函数将 this 发送到调用对象。它经常被用来初始化一个对象。 Learn more here .

关于javascript - 包装 Angular $resource 请求不返回 POST 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14788292/

相关文章:

javascript - 如何在 javascript 文件本身中设置字符集 ="utf-8"

javascript - 选择单选按钮时显示的 div 标签

node.js - 如何使用JWT和Passport正确使用nodeJs API的身份验证?

asp.net - OAuth (OAuth2) ASP.NET REST Web API (Self host - windows service) 实现

javascript - 在 Angular.Js 完成内容加载后加载 JavaScript

javascript - Socket IO 服务器到服务器

java - 是否有 Roo 应用程序与外部 REST 服务交互以进行查找和/或验证的示例

css - 如何在没有垂直滚动的情况下将基于页面大小的数据加载到 ui-grid-viewport 中?

javascript - Angular.js ng-repeat 使用 json 没有数据

javascript - 通过ajax将复杂对象发送到 Controller