2017-04-25 45 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 
      } 
     }); 
相关问题