2014-04-14 48 views
0

我正在嘗試重構我的AngularJS應用程序並引入登錄服務。目前我的控制器有如login(),logout(),getCurrentUser()等方法,它們會發出http請求並處理用戶對象。我想將這些函數轉換爲服務,因爲我需要從多個控制器中調用getCurrentUser()方法。在AngularJS中編寫登錄服務

我寫了下面的服務:

angular.module('common.login', []). 
    factory('loginService', function ($http) { 

     return { 
      user: null, 
      error: null 
     }; 
    }); 

所以此刻的服務沒有做任何事情。然而我得到一個錯誤:

Uncaught Error: Circular dependency: loginService <- $http 

如果我從回調函數中刪除$ http依賴項,那麼該服務的工作。我很難理解爲什麼存在循環依賴。 loginService工廠被注入到兩個位置:A **主模塊的配置回調**和一個**登錄模塊的控制器回調**。配置回調配置一個http攔截器,登錄控制器也使用http服務。

+0

你好lanoxx。請發佈您的控制器簽名,以瞭解DI問題。 – blint

+0

我幾乎建議在rootScope上而不是作爲服務使用這個函數。 – Mindstormy

回答

1

循環依賴是由於您配置了一個httpInterceptor來發送某個認證令牌或攔截401錯誤而導致依賴於您的登錄服務而依賴於$ http服務。

您的httpInterceptor不應該依賴於您的登錄服務。 例如,如果您需要發送令牌,則可以在登錄時將其存儲在localStorage中,然後在您的httpInterceptor中從它讀取而不是loginService。 如果您在出現401錯誤時需要註銷用戶,請將用戶重定向到/註銷,而不是在loginService上調用註銷方法。