html - 登录时隐藏按钮,未登录时显示其他按钮
问题描述
在我的 Angular 8 应用程序中,我试图更新一个下拉菜单,其中未登录时显示 2 个按钮,登录时显示 1 个按钮(Sign In
以及Register
未登录时和Sign Out
登录时)。我无法使该功能正常工作。
我尝试过执行以下操作:
- 更改
authService.afAuth.auth
为authService.user
(没有做任何事情) - 更改
(authService.afAuth.auth | async)
为authService.afAuth.auth == true
和authService.afAuth.auth == false
(没有做任何事情) - 更改按钮的位置(到工具栏之外 - 不起作用)
这里有几个文件片段 - 不知道从哪里开始寻找根本问题。
Mat-menu 部分header.component.html
<mat-menu #account="matMenu">
<button mat-menu-item routerLink="/sign-in" *ngIf="authService.isLoggedIn == true">Log In</button>
<button *ngIf="authService.isLoggedIn == true" mat-menu-item routerLink="/register">Register</button>
<button *ngIf="authService.isLoggedIn == false" mat-menu-item routerLink="/signout">Sign Out</button>
</mat-menu>
打开下拉列表的按钮(仍在 header.component.html 内)
<button mat-button [matMenuTriggerFor]="account">Account Management</button>
注销组件 .ts 文件(重定向注销部分的文件 - 不确定这是否只是未正确注销的问题)
import { Component, OnInit } from '@angular/core';
import { AuthService } from 'src/app/shared/services/auth.service';
@Component({
selector: 'app-signout',
templateUrl: './signout.component.html',
styleUrls: ['./signout.component.css']
})
export class SignoutComponent implements OnInit {
constructor(
public authService: AuthService
) { }
ngOnInit() {
}
}
这是 signout.component.html 文件
<div class="center">
<h3>Sign Out</h3>
<button mat-button (click)="authService.SignOut()">Confirm Sign Out</button>
</div>
以下是 auth.service.ts 文件的一些部分
constructor(
public afs: AngularFirestore, // Inject Firestore service
public afAuth: AngularFireAuth, // Inject Firebase auth service
public router: Router,
public ngZone: NgZone // NgZone service to remove outside scope warning
) {
/* Saving user data in localstorage when
logged in and setting up null when logged out */
this.afAuth.authState.subscribe(user => {
if (user) {
this.userData = user;
localStorage.setItem('user', JSON.stringify(this.userData));
JSON.parse(localStorage.getItem('user'));
} else {
localStorage.setItem('user', null);
JSON.parse(localStorage.getItem('user'));
}
})
}
...
get isLoggedIn(): boolean {
const user = JSON.parse(localStorage.getItem('user'));
return (user !== null && user.emailVerified !== false) ? true : false;
}
...
SignOut() {
return this.afAuth.auth.signOut().then(() => {
localStorage.removeItem('user');
this.router.navigate(['home']);
})
}
预期结果:用户已注销,sign in
andregister
按钮出现,sign out
按钮消失。
实际结果:它要么: A. 不注销用户,在这种情况下,这是一个 auth.service.ts 问题 B. 即使在刷新后也没有检测到用户被注销的变化
我在控制台中没有收到任何错误。
解决方案
正如@sagat 在评论中所说, header.component.ts 需要从这里更新:
<mat-menu #account="matMenu">
<button mat-menu-item routerLink="/sign-in" *ngIf="authService.isLoggedIn == true">Log In</button>
<button *ngIf="authService.isLoggedIn == true" mat-menu-item routerLink="/register">Register</button>
<button *ngIf="authService.isLoggedIn == false" mat-menu-item routerLink="/signout">Sign Out</button>
</mat-menu>
对此(注销时的假更改为真,登录和注册时的真更改为假)
<mat-menu #account="matMenu">
<button mat-menu-item routerLink="/sign-in" *ngIf="authService.isLoggedIn == false">Log In</button>
<button *ngIf="authService.isLoggedIn == false" mat-menu-item routerLink="/register">Register</button>
<button *ngIf="authService.isLoggedIn == true" mat-menu-item routerLink="/signout">Sign Out</button>
</mat-menu>
推荐阅读
- tree - 图算法/生物信息学
- javascript - 完成所有 API 后如何设置作用域变量标志的值?
- amazon-web-services - 无法使用 CloudFormation 让 API 代理与 SQS 一起使用
- django - 激活 virtualenv 时仍然安装全局依赖项
- apache - 将 Nginx 配置转换为 Apache
- python - 检查一个 DataFrame 中的一行是否存在于另一个 DataFrame 中,仅基于特定列
- c# - 按极角排序点
- compare - 我如何将 2 张纸与某些标准进行比较,然后将相邻的单元格复制到第 1 张
- bash - 如何记录用于启动 bash 脚本的命令?
- kubernetes - Kubernetes 主机节点是否应该能够访问集群中运行的服务?