1

在我的应用程序组件中,我想检查用户是否在加载后立即通过身份验证,如果没有立即将用户重定向到公共页面,而不是加载主页(个人资料)页面。我正在使用可以在此处找到的 Auth0 服务:链接到 GitHub 文件

问题是,我应该在 inconstructor还是 in 中运行它ngOnInit,为什么?

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

3 回答 3

2

您可能需要考虑将其添加到路由保护中,而不是将其添加到组件构造函数/ngOnInit 中。

我在这里有一个例子:https ://github.com/DeborahK/Angular-Routing

查看用户文件夹中的auth.service.tsauth-guard.service.ts文件。这个例子没有使用 Auth0,但它确实有 Angular 的“管道”。

于 2017-04-25T21:53:59.723 回答
1

一般来说,您应该避免将任何业务逻辑放在组件或指令的构造函数中。

为什么?

因为,在运行组件的构造函数时,Angular 尚未初始化该组件(或指令)可能具有的任何输入。因此,如果初始化逻辑依赖于其输入的值,那么这些输入将没有正确的值,从而导致业务逻辑不正确。

但是我的组件/指令初始化不依赖于它的输入!!

现在可能是这样,但是如果/当这种情况发生变化时,您现在必须记住将所有逻辑从 to 移动constructorngOnInit这只是自找麻烦。然后,您会遇到这种不一致,其中一些组件使用构造函数进行初始化逻辑而其他组件使用ngOnInit,并且这种不必要的不​​一致也只是在您的应用程序开发时自找麻烦。这与为什么强烈建议始终@Injectable在所有服务上添加装饰器的原因相同,即使您在技术上仅在您的服务使用依赖注入时才需要它 - 始终添加它,这样您就不会忘记在以后确实需要它时执行它.

TLDR;

为了保持一致性并在以后避免调试问题,请仅在组件中使用构造函数来捕获可注入对象作为属性 - 将所有其他逻辑放入ngOnInit.

笔记

但是,正如@DeborahK 指出的那样,在这种特定情况下,如果不满足某个条件,您希望基本上防止组件被路由到,更好的解决方案可能是路由器保护。如果不满足某些条件,路由器的此功能将完全阻止组件初始化。

于 2017-04-25T22:15:08.537 回答
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
            }
        });
于 2017-04-26T07:43:19.023 回答