在我的應用程序組件中,我想檢查用戶是否在加載後立即進行身份驗證,並且如果不立即將用戶重定向到公共頁面,而不是加載主頁面(配置文件)頁面。我使用的Auth0服務可以在這裏找到:link to GitHub file檢查身份驗證狀態並重定向用戶
問題是,我應該在constructor
或ngOnInit
運行此爲什麼?
if (auth.isAuthenticated()) {
router.navigateByUrl(...))
}
在我的應用程序組件中,我想檢查用戶是否在加載後立即進行身份驗證,並且如果不立即將用戶重定向到公共頁面,而不是加載主頁面(配置文件)頁面。我使用的Auth0服務可以在這裏找到:link to GitHub file檢查身份驗證狀態並重定向用戶
問題是,我應該在constructor
或ngOnInit
運行此爲什麼?
if (auth.isAuthenticated()) {
router.navigateByUrl(...))
}
通常,您應該避免將任何業務邏輯放在組件或指令的構造函數中。
爲什麼?
因爲,在運行組件的構造函數時,Angular尚未初始化組件(或指令)可能具有的任何輸入。因此,如果初始化邏輯取決於其輸入的值,那麼這些輸入將沒有正確的值,從而導致不正確的業務邏輯。
但我的組件/指令初始化不依賴於它的輸入!
現在可能是這樣,但如果/當這種變化,你現在必須記住將所有的邏輯從constructor
移動到ngOnInit
,這只是要求麻煩。然後,如果某些組件使用構造函數進行初始化邏輯,而其他組件使用ngOnInit
,則會產生這種不一致性,並且在您的應用程序開發過程中,不必要的不一致性也會造成問題。強烈的建議是爲所有服務添加@Injectable
裝飾器的原因是相同的,即使你的技術上只需要它就可以了,如果你的服務使用依賴注入 - 總是添加它,所以你不會忘記在以後實際需要時使用它它。
TLDR;
爲了保持一致性並在以後節省自己的調試問題,只能在組件中使用您的構造函數來捕獲注射劑作爲屬性 - 將所有其他邏輯放在ngOnInit
中。
注意
由於@DeborahK指出,然而,在這種特定情況下,你想基本上是防止被路由到如果某個條件不符合一個組成部分,一個更好的解決方案可能是一個router guard.如果不滿足某些條件,則路由器的此功能會阻止組件初始化。
您可能需要考慮將其添加到路由守衛中,而不是將其添加到組件構造函數/ ngOnInit中。
我這裏有一個例子:https://github.com/DeborahK/Angular-Routing
看到在用戶文件夾中的auth.service.ts
和auth-guard.service.ts
文件。這個例子不使用Auth0,但它確實有Angular「plumbing」。
您可以檢查登錄創建工廠調用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
}
});
謝謝你,你的代碼確實幫助! – Sammy