在我的应用程序组件中,我想检查用户是否在加载后立即进行身份验证,并且如果不立即将用户重定向到公共页面,而不是加载主页面(配置文件)页面。我使用的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