【发布时间】:2016-06-22 15:14:02
【问题描述】:
我希望服务提供如下代码中的资源:
angular.module('myApp.userService', ['ngResource'])
.factory('UserService', function ($resource)
{
var user = $resource('/api/user', {},
{
connect: { method: 'POST', params: {}, isArray:false }
});
return user;
}
然后在使用connect 操作时,我想动态传递一个HTTP 标头,这意味着它可能会因每次调用而改变。这是一个例子,在控制器中,请看代码中的注释:
$scope.user = UserService;
$scope.connect = function ( user )
{
var hash = 'Basic ' + Base64Service.encode(user.login + ':' + user.password);
// I would like this header to be computed
// and used by the user resource
// each time I call this function
$scope.user.headers = [{Authorization: hash}];
$scope.user.connect( {},
function()
{
// successful login
$location.path('/connected');
}
,function()
{
console.log('There was an error, please try again');
});
}
你知道直接或通过技巧来做到这一点吗?
最后的想法
已接受的答案并未完全回答问题,因为标题不是完全动态的,因为工厂实际上返回了一个工厂 (!),而我的代码中并非如此。
由于 $resource 是一个工厂,因此无法使其动态化。
我最终在每次用户连接时销毁资源对象。这样,我就有了在用户连接时计算出的带有标头的资源。
@Stewie 提供的解决方案对此很有用,因此我将其视为已接受。
这是我进行连接的方式,可以多次使用,因为资源在(重新)连接时被破坏/重新创建:
this.connect = function (user)
{
self.hash = 'Basic ' + Base64Service.encode(user.login + ':' + user.password);
console.log("CONNECT login:" + user.login + " - pwd:" + user.password + " - hash:" + self.hash);
if (self.userResource)
{
delete self.userResource;
}
self.userResource = $resource('/api/user/login', {}, {
connect: {
method: 'POST',
params: {},
isArray: false,
headers: { Authorization: self.hash }
}
});
var deferred = $q.defer();
self.userResource.connect(user,
function (data)
{
//console.log('--------- user logged in ----- ' + JSON.stringify(data));
// successful login
if (!!self.user)
{
angular.copy(data, self.user);
}
else
{
self.user = data;
}
self.setConnected();
storage.set('user', self);
deferred.resolve(self);
},
function (error)
{
self.user = {};
self.isLogged = false;
storage.set('user', self);
deferred.reject(error);
}
);
return deferred.promise;
};
【问题讨论】:
-
"... 动态 HTTP 标头路径"??
-
@Stewie 我更新了我的问题
-
@unludo 为了完成您自己的答案,您能否展示如何“在每次用户连接时销毁资源对象”? (我也遇到了同样的问题,想重新加载工厂。)
-
@pimpin 给你,我加了一个例子。
-
非常感谢@unludo。总之,请注意您在一年内升级了您的编码风格(使用 controllerAs 选项来公开附加到您的控制器而不是范围的方法)。
标签: angularjs angular-resource