unl*_*udo 12 angularjs angular-resource
我想提供服务提供资源,如下面的代码:
angular.module('myApp.userService', ['ngResource'])
.factory('UserService', function ($resource)
{
var user = $resource('/api/user', {},
{
connect: { method: 'POST', params: {}, isArray:false }
});
return user;
}
Run Code Online (Sandbox Code Playgroud)
然后在使用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');
});
}
Run Code Online (Sandbox Code Playgroud)
你知道这样做的方法,无论是直接还是通过技巧?
接受的答案并没有完全回答这个问题,因为标题不是完全动态的,因为工厂实际上返回了一个工厂(!),这在我的代码中并非如此.
由于$ 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;
Run Code Online (Sandbox Code Playgroud)
};
Ste*_*wie 18
从angularjs v1.1.1和ngResource v.1.1.1开始,可以使用action对象的headers属性来完成$resource.
您可以将资源包装在一个接受自定义标头作为参数的函数中,并返回一个$resource对象,并在适当的操作定义中设置自定义标头:
var app = angular.module('plunker', ['ngResource']);
app.controller('AppController',
[
'$scope',
'UserService',
function($scope, UserService) {
$scope.user = {login: 'doe@example.com', password: '123'};
$scope.connect = function() {
// dropping out base64 encoding here, for simplicity
var hash = 'Basic ' + $scope.user.login + ':' + $scope.user.password;
$scope.user.headers = [{Authorization: hash}];
UserService({Authorization: hash}).connect(
function () {
$location.url('/connected');
},
function () {
console.log('There was an error, please try again');
}
);
};
}
]
);
app.factory('UserService', function ($resource) {
return function(customHeaders){
return $resource('/api/user', {}, {
connect: {
method: 'POST',
params: {},
isArray: false,
headers: customHeaders || {}
}
});
};
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5862 次 |
| 最近记录: |