2014-05-02 62 views
1

我試圖用角度和休息api構建簡單的登錄,我檢查用戶是否登錄登錄表單控制器有奇怪的問題。當直接從控制器訪問時,工廠屬性爲空角度

這裏是我的代碼:

每次我刷新我的應用程序加載當前登錄的用戶

angular.module('myApp').run(['security', function(security) { 
    security.requestCurrentUser(); 
}]); 

安全模塊是這樣的(simplefied,由角應用的啓發)

angular.module('security').factory('security', ['SERVER_CONFIG', '$http', '$q', '$location', 'securityRetryQueue', 
    function (SERVER_CONFIG, $http, $q, $location, queue) { 

     var service = { 

      currentUser : null, 

      isAuthenticated : function() { 
       return !!service.currentUser; 
      }, 

      login : 
        ....  
      }, 

      logout : 
        .... 
      }, 

      requestCurrentUser : 
        ... 
      } 
     }; 

     return service; 
}]); 

因此它保存有關當前用戶的數據並使用isAuthenticated可以發現用戶是否已登錄

angular.module('security.login').controller('LoginFormCtrl', ['$scope', 'security', function ($scope, security) { 

    console.log(security) 
    console.log(security.currentUser) 
    console.log(security.isAuthenticated()) 

}]); 

的console.log(安全)返回對象,其中財產用戶充滿了用戶的數據,以便方法isAuthenticated返回true

但這裏來的奇怪的事情:

security.user返回nullsecurity.isAuthenticated()返回false,我不明白爲什麼用戶空... 我需要它重定向從登錄頁面時訪問和用戶已登錄。我知道角應用程序使用模式爲此,所以它可以解決我的問題,但我不想使用模態...

如果任何人都可以解釋我「M做錯了我會很高興...

非常感謝Blažek

+0

Security.user與security.currentUser相同,還是代碼中未顯示的另一個屬性? – tasseKATT

+0

對不起有一個錯誤,我寫入到stackoverflow時應該有currentUser而不是用戶...編輯... – blazek

回答

0

您的應用程序是在事物的命名,這可能會導致一些衝突有點混亂。你的模塊被命名爲'安全',你的工廠被命名爲'安全',這會讓人很容易混淆哪一個被注入到哪裏。所以嘗試重新命名一些東西,如'securityModule'和'securityFactory'來區分。

現在,我通常是通過一個應用程序持久化數據的方法是用結構化的,像這樣的一個服務:

angular.module('security').service('security', ['SERVER_CONFIG', '$http', '$q', '$location', 'securityRetryQueue', function (SERVER_CONFIG, $http, $q, $location, queue) { // data that is persisted var currentUser = null; var someOtherData = null; // internal functions function getCurrentUser(){ ... do stuff ... } function doOtherStuff(){ ... do stuff ... }
// public methods // for use in controllers return { getCurrentUser : function(){ return currentUser }, setCurrentUser : function(param){ currentUser = param } isAuthenticated : function() { return !!service.currentUser; }, login : ....
}, logout : .... }, requestCurrentUser : ... } }; return service; }]);

現在,另一件事看的是你「提神」你的應用程序,當你點擊刷新,您可能(取決於瀏覽器)在本地銷燬所有存儲的數據,然後您需要在第一次加載時從服務器獲取它。

+0

感謝您的回覆,現在我看到它不清楚從我的答案,我從用戶數據獲取每個頁面刷新(第一代碼片段)使用函數requestCurrentUser .... 幾分鐘前,我發現有可能與requestCurrentUser中的異步通信問題,所以我必須觀察更改,因爲我之前訪問currentUser屬性數據被提取...所以我已經在該屬性上添加了監視器,所以現在它以我想要的方式工作,無論如何感謝提示 – blazek