为啥 Angular Oninit 仅在离开页面时才调用服务

Posted

技术标签:

【中文标题】为啥 Angular Oninit 仅在离开页面时才调用服务【英文标题】:Why does Angular Oninit only call service when navigated away from page为什么 Angular Oninit 仅在离开页面时才调用服务 【发布时间】:2021-10-09 12:23:12 【问题描述】:

使用 Angular 路由器,当用户导航到 SPA 的某个页面时,我想通过调用ngOninit 中的服务来检查用户是否已通过身份验证,以便将登录或注销按钮显示为情况可能是。但是ngOninit 不会触发,只会在我离开相关页面时触发。可能是什么原因造成的,我是否错过了生命周期挂钩课程?

    export class HomeComponent implements OnInit 

     loggedIn? = false;

     constructor(private authservice: AuthenticationService) 

     ngOnInit(): void 
      this.authservice.loadUserCredentials()
      .subscribe(
        next: res => 
          console.log('res ',res)
          this.loggedIn = res;
        
      )
    

    ```
    

【问题讨论】:

要检查用户身份验证,您需要使用 auth Guards not a service in ngOnInit 阅读更多相关信息angular.io/api/router/CanActivate @KamranKhatti 我现在不想保护任何路线,我只想调用一个服务来检查用户是否经过身份验证,以便显示适当的按钮、登录或登录-出去。我已经重构让导航栏包装路由器插座,而不是在每个组件中都有导航栏,这是设计使然。并且这个问题已经被规避了。但我仍然想知道为什么 ngOninit 仅在我离开组件时才会触发。 【参考方案1】:
export class HomeComponent implements OnInit 

 loggedIn? = false;

 constructor(
private authservice: AuthenticationService,
    private router: Router,
) 

 ngOnInit(): void 
  this.router.events.subscribe((ev) => 
      if (ev instanceof NavigationEnd) 
        // Call your authenticate method
      

在我的 ionic-angular 应用程序中,我是这样做的。

【讨论】:

这看起来可以在 Angular 中工作,虽然我已经重构以规避这个问题,但会尝试一下并回复你。

以上是关于为啥 Angular Oninit 仅在离开页面时才调用服务的主要内容,如果未能解决你的问题,请参考以下文章

将 url 留在 Angular 中时从本地存储中删除值

当我们谈论 OnInit 时,Angular 2+ 中组件初始化的确切含义是啥?

Angular2指令,构造函数与onInit [重复]

仅在刷新页面时令牌过期时注销?为啥?

Angular 5 - 当用户关闭浏览器窗口时如何进行 API 调用?

Angular 1.5 $onInit 未触发 - 打字稿