我创建了一个与API通信的角度工厂。对于该API,我需要为每个请求传入一个“x-token”自定义标头,并且一旦用户登录,该标记就会在localstorage中创建。
我注意到工厂认为令牌为空,可能是因为工厂在用户登录之前加载了?
有没有办法在用户登录后在工厂中填充此令牌,或者有更好的方法来处理此问题?
app.factory('apiFactory', ['$http', function($http){
$http.defaults.headers.common['x-token'] = localStorage.getItem("token");
在上面的代码示例中,工厂说x-token为null,而它肯定在localstorage中。
答案 0 :(得分:0)
我认为你是正确的,因为工厂在用户登录之前加载,因此令牌为空。
有几种方法可以解决这个问题。您可以使用$rootScope.$on
事件调用松散地耦合标头值的设置,如下所示:
app.factory("apiFactory", [
"$http", function($http) {
return $rootScope.$on("loginSuccess", function() {
$http.defaults.headers.common["x-token"] = localStorage.getItem("token");
});
}
]);
当用户成功登录时(设置$broadcast
之后),您将localStorage
该事件。
$rootScope.$broadcast('loginSuccess');
另一种方法是通过某种apiFactory.setHeader(token)
方法紧密耦合标题值的设置。然后,您可以将apiFactory注入执行登录的控制器或服务,并在成功时调用该方法。