我正在用简单的包装器包装我的$ 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方法(不返回的方法),一切正常 一个身体似乎),但我不能得到$ 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代码,但几个小时后我无法确定 出来。我无法理解为什么返回正文,但在包装器资源中它无法访问。
任何想法或帮助将不胜感激。感谢。
答案 0 :(得分:2)
在深入研究AngularJS源代码时,我找到了解决方案。
问题是包装器返回的是函数而不是对象,这给出了一些问题。解决方案是更改包装器中的以下行:
return resource['_' + action](param, data, success, error);
这一个:
return resource['_' + action].call(this, params, data, success, error);
为什么呢?快速回答是因为在角度资源的源代码中他们使用它。实际上#call运行将此函数发送给调用对象的函数。它通常用于初始化对象。 Learn more here