【问题标题】:Angular How do you know when Authentication Status changed?Angular 您如何知道身份验证状态何时更改?
【发布时间】:2017-12-07 10:43:31
【问题描述】:

我目前正在开发一个登录的网络应用程序。但是我的注销按钮有问题。注销按钮仅应在您登录时显示,并在您注销时消失。

那是我的按钮(menu-items.component):

<ul class="list-group">
  <li *ngIf="isLoggedIn" (click)="onLogout()">Logout</li>
</ul>

代码(menu-items.component):

import { Component, OnInit } from '@angular/core';
import { HttpService } from '../../http.service';
import { Subscription } from 'rxjs';

@Component({
  selector: 'app-menu-items',
  templateUrl: './menu-items.component.html',
  styleUrls: ['./menu-items.component.css']
})
export class MenuItemsComponent implements OnInit {
  isLoggedIn: boolean = false;
  constructor(private httpService: HttpService) {

  }

  ngOnInit() {

  }
  onSignout(){
    this.isLoggedIn = false;
    localStorage.removeItem('currentUser');
  }
}

基本上,当我登录时,我希望“isLoggedIn”为“true”。

登录部分(login.component):

 onSignin(){

    const username = this.loginForm.get('username').value;
    const password = this.loginForm.get('password').value;

    this.httpServie.sendDataLogin("grant_type=password&username=" + username + "&password=" + password)
      .subscribe(
        data => {
         this.token = JSON.parse(data["_body"]).access_token
         this.username = JSON.parse(data["_body"]).userName
         localStorage.setItem('currentUser', JSON.stringify({username: this.username, token: this.token}))

        },
        err => {
          if (err.error instanceof Error) {

            this.ServerErrorMsg = err.error.message;
          } else {

            const returnArray = [];
            this.ServerErrorMsg = JSON.parse(err._body).error_description + "\n";
          }
        }
      );
  }

登录部分正在工作!我将我的数据发送到我的 API,作为回报,我得到了我的令牌。

但问题是我如何告诉我的 isLoggedIn 布尔值我现在已登录?我想我需要一个可观察的或其他东西来订阅,对吧? 我是 Angular 的新手,我不太了解 observables。有人可以帮帮我吗?

【问题讨论】:

    标签: angular authentication observable subscription


    【解决方案1】:

    我相信您在成功登录后忘记更新您的 isLoggedIn 变量。

    试试这个

    subscribe(
        data => {
         this.token = JSON.parse(data["_body"]).access_token
         this.username = JSON.parse(data["_body"]).userName
         localStorage.setItem('currentUser', JSON.stringify({username: this.username, token: this.token}))
    this.isLoggedIn=true;
    }
    

    【讨论】:

    • isLoggedIn 在“menu-items.component”中,但 onSingin 函数在“login-component”中
    • 啊好吧抱歉错过了那一点。在那种情况下,登录组件是菜单组件的子组件吗?还是他们完全分离?
    • 完全分离
    • 在这种情况下,要么你有一个处理事件的通用服务,要么你有一个被这两个组件使用的服务,一个发出值,另一个订阅它。
    • 好吧,但你是怎么做到的?
    【解决方案2】:

    我向您建议的是在您的服务中(更好)或在您的组件中(没有那么好)一种 getter 方法,例如:

    私有_isLogged:boolean =false;

    isLoggedIn(){
    
     var local= localStorage.getItem('currentUser');
    var token= JSON.Parse(local) as any;
    
    return local && token && token.access_token;
    }
    onSignin(){
    
        const username = this.loginForm.get('username').value;
        const password = this.loginForm.get('password').value;
    
        this.httpServie.sendDataLogin("grant_type=password&username=" + username + "&password=" + password)
          .subscribe(
            data => {
             this.token = JSON.parse(data["_body"]).access_token
             this.username = JSON.parse(data["_body"]).userName
             localStorage.setItem('currentUser', JSON.stringify({username: this.username, token: this.token}));
    

    this._isLogged = true; //

            },
            err => {
              if (err.error instanceof Error) {
    
                this.ServerErrorMsg = err.error.message;
              } else {
    
                const returnArray = [];
                this.ServerErrorMsg = JSON.parse(err._body).error_description + "\n";
              }
            }
          );
      }
    

    然后在您的代码中:

    <ul class="list-group">
      <li *ngIf="isLoggedIn()" (click)="onLogout()">Logout</li>
    </ul>
    

    希望对你有帮助!

    【讨论】:

    • 感谢您的回复。你能更详细地解释一下吗?我在 http.service 中创建了函数 isLoggedIn。但我真的不明白你说的其余部分^^ 而且我认为你不能使用不在同一个组件中的函数来使用 ngIf 吗?并且登录和注销功能不在同一个组件上
    • 我忘记了返回按钮 = 添加评论 ^^ 请再次阅读我的第一条评论
    猜你喜欢
    • 1970-01-01
    • 2021-01-02
    • 1970-01-01
    • 1970-01-01
    • 2020-07-13
    • 2021-06-23
    • 2021-04-26
    • 2021-08-24
    • 2022-01-04
    相关资源
    最近更新 更多