2017-04-25 37 views
1

在我的應用程序組件中,我想檢查用戶是否在加載後立即進行身份驗證,並且如果不立即將用戶重定向到公共頁面,而不是加載主頁面(配置文件)頁面。我使用的Auth0服務可以在這裏找到:link to GitHub file檢查身份驗證狀態並重定向用戶

問題是,我應該在constructorngOnInit運行此爲什麼?

if (auth.isAuthenticated()) { 
    router.navigateByUrl(...)) 
} 

回答

1

通常,您應該避免將任何業務邏輯放在組件或指令的構造函數中。

爲什麼?

因爲,在運行組件的構造函數時,Angular尚未初始化組件(或指令)可能具有的任何輸入。因此,如果初始化邏輯取決於其輸入的值,那麼這些輸入將沒有正確的值,從而導致不正確的業務邏輯。

但我的組件/指令初始化不依賴於它的輸入!

現在可能是這樣,但如果/當這種變化,你現在必須記住將所有的邏輯從constructor移動到ngOnInit,這只是要求麻煩。然後,如果某些組件使用構造函數進行初始化邏輯,而其他組件使用ngOnInit,則會產生這種不一致性,並且在您的應用程序開發過程中,不必要的不​​一致性也會造成問題。強烈的建議是爲所有服務添加@Injectable裝飾器的原因是相同的,即使你的技術上只需要它就可以了,如果你的服務使用依賴注入 - 總是添加它,所以你不會忘記在以後實際需要時使用它它。

TLDR;

爲了保持一致性並在以後節省自己的調試問題,只能在組件中使用您的構造函數來捕獲注射劑作爲屬性 - 將所有其他邏輯放在ngOnInit中。

注意

由於@DeborahK指出,然而,在這種特定情況下,你想基本上是防止被路由到如果某個條件不符合一個組成部分,一個更好的解決方案可能是一個router guard.如果不滿足某些條件,則路由器的此功能會阻止組件初始化。

2

您可能需要考慮將其添加到路由守衛中,而不是將其添加到組件構造函數/ ngOnInit中。

我這裏有一個例子:https://github.com/DeborahK/Angular-Routing

看到在用戶文件夾中的auth.service.tsauth-guard.service.ts文件。這個例子不使用Auth0,但它確實有Angular「plumbing」。

+0

謝謝你,你的代碼確實幫助! – Sammy

0

您可以檢查登錄創建工廠調用API

.factory('check_login_session', function ($rootScope,ApiService,ApiEndpoint ,$location,$cookies,$timeout) { 
     return { 
      success : function(response) { 

       var check_login ={ 
        wut_token : $cookies.user_details 
       }; 
       return ApiService.postModel(ApiEndpoint.Models.check_login,check_login).then(function (response) { 
        if (response.SUCCESS == "FALSE") { 
         $location.path("staticpage"); 
        } else { 

         return response.SUCCESS; 
        } 
       }) 

      } 
     } 
    }); 

在控制器

check_login_session.success().then(function(res) { 
      if(res == "TRUE"){ 
       //do as you want 
      } 
     }); 
相關問題