在我的应用程序组件中,我想检查用户是否在加载后立即进行身份验证,如果没有立即将用户重定向到公共页面而不是加载主页(配置文件)页面。我正在使用可在此处找到的Auth0服务:link to GitHub file
问题是,我应该在constructor
或ngOnInit
中运行此操作吗?为什么?
if (auth.isAuthenticated()) {
router.navigateByUrl(...))
}
答案 0 :(得分:2)
您可能需要考虑将其添加到路线保护中,而不是将其添加到组件构造函数/ ngOnInit中。
我在这里有一个例子:https://github.com/DeborahK/Angular-Routing
请参阅用户文件夹中的auth.service.ts
和auth-guard.service.ts
文件。这个例子没有使用Auth0,但它确实有Angular" plumbing"。
答案 1 :(得分:1)
通常,您应该避免在组件或指令的构造函数中放置任何业务逻辑。
<强>为什么吗
因为在运行组件的构造函数时,Angular尚未初始化组件(或指令)可能具有的任何输入。因此,如果初始化逻辑依赖于其输入的值,那些输入将没有正确的值,从而导致错误的业务逻辑。
但我的组件/指令初始化并不依赖于它的输入!!
现在可能是这样,但如果/何时发生变化,您现在必须记住将所有逻辑从constructor
移到ngOnInit
,这只是在寻找麻烦。然后,你会遇到这种不一致的情况,其中一些组件使用构造函数进行初始化逻辑,而其他组件使用ngOnInit
,并且不必要的不一致也只是在应用程序开发时遇到麻烦。这也是为什么强烈建议总是在所有服务上添加@Injectable
装饰器的原因相同,即使你的服务使用依赖注入技术上只需要它 - 总是添加它,所以你不要忘记以后再做你确实需要它。
<强> TLDR; 强>
为了保持一致性并在以后保存自己的调试问题,只需在组件中使用构造函数将注入事件作为属性捕获 - 将所有其他逻辑放在ngOnInit
中。
注意强>
正如@DeborahK指出的那样,在这种特定情况下,如果某个条件不满足,你想要基本上阻止组件被路由到,一个更好的解决方案可能是router guard.如果不满足某些条件,路由器会阻止组件初始化。
答案 2 :(得分: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
}
});