修正Angular中的循环依赖

时间:2016-02-18 20:58:48

标签: javascript angularjs

所以我有两个角度的工厂,一个与用户相关的工厂(用户登录?与后端通话并登录她)

  app.factory('userFactory', function($window, $location, $http) {
        var loggedUser = {}; 

        loggedUser.isLogged = false;

        loggedUser.check = function() {
             if($window.sessionStorage.user) {           
                this.isLogged = true;
            } else {
                this.isLogged = false;               
            }
        }        

        loggedUser.doLogin = function (theData) {                
                var promise = $http({method: 'POST', url: 'http://whatevah/login', data: theData});                
                return promise;            
        } 

        return  loggedUser;

    });             

和拦截器相关的一个(发送一个令牌并抓住答案以查看用户是否已登录)。

  app.factory('tokenFactory', function($q, $window, $http) {
    return {
      request: function(config) {
        config.headers = config.headers || {};
        if ($window.sessionStorage.token) {
          $http.defaults.headers.common['mytoken'] = $window.sessionStorage.token;
        }
        return config || $q.when(config);
      },

      response: function(response) {
        return response || $q.when(response);
      }
    };
  });

他们都注入$http,导致此错误

Circular dependency found: $http <- tokenFactory<- $http <- userFactory

我很奇怪两个不同的角度工厂不能注入相同的工厂,因为工厂有不同的名称,做不同的事情

我该如何解决这个问题?

由于

1 个答案:

答案 0 :(得分:1)

正如@mzulch评论的那样,你不能依赖于用作http拦截器的工厂中的$ http。

在您的情况下,最简单的解决方案就是设置请求的标头,而不是全局标头:

app.factory('tokenFactory', function($q, $window) {
  return {
    request: function(config) {
      config.headers = config.headers || {};
      if ($window.sessionStorage.token) {
        config.headers['mytoken'] = $window.sessionStorage.token;
      }
      return config || $q.when(config);
    },

    response: function(response) {
      return response || $q.when(response);
    }
  };
});