Angular 的 *ngIf 在重新路由时不起作用
Angular's *ngIf doesn't work on a re-routing
我对 *ngIf 在 Angular 中的工作方式有疑问。我有一个导航栏组件进行检查,应该根据 true/false 响应呈现不同的列表,它在这方面工作正常,但在路由到不同页面后它停止工作,直到我再次刷新页面。
HTML:
<div *ngIf="isUserValid(); then logged_in else logged_out"></div>
<ng-template #logged_out>
<ul class="dropdown-menu dropdown-menu-dark dropdown-menu-end" aria-labelledby="navbarDropdown">
<li>
<p class="dropdown-item">You are not logged in!</p>
</li>
<li><hr class="dropdown-divider"></li>
<li>
<a class="dropdown-item" routerLink="/login"> Login </a>
</li>
<li>
<a class="dropdown-item" routerLink="/signup"> Sign-Up </a>
</li>
</ul>
</ng-template>
<!-- If user is logged in -->
<ng-template #logged_in>
<ul class="dropdown-menu dropdown-menu-dark dropdown-menu-end" aria-labelledby="navbarDropdown">
<li>
<p class="dropdown-item">Hi, [user's name]</p>
</li>
<li><hr class="dropdown-divider"></li>
<li>
<a class="dropdown-item" (click)="quit()" routerLink="/login"> Sign-Out </a>
</li>
</ul>
</ng-template>
TS(这是单击退出时发生的情况):
quit(): void{
this.is_valid_user = false;
localStorage.clear();
this.router.navigate(['login']).then(r => console.log('user quit'));
}
isUserValid(): boolean{
return this.is_valid_user;
}
当您点击注销按钮时,它应该重定向并显示已注销的块,但它什么也不显示,只有在页面刷新后才会显示。感谢任何帮助。
在angular中你必须知道一个组件被初始化一次。路由器 link 不会更改组件的状态。完全刷新再次启动 angular 生命周期。所以我假设你的“isUserValid()”只执行一次。你能提供完整的打字稿文件吗?您将“isUserValid()”方法放在哪里?
你也可以简化你的 *ngIf:
<ng-container *ngIf="isUserValid(); else logged_out">
<ul class="dropdown-menu dropdown-menu-dark dropdown-menu-end" aria-labelledby="navbarDropdown">
<li>
<p class="dropdown-item">Hi, [user's name]</p>
</li>
<li><hr class="dropdown-divider"></li>
<li>
<a class="dropdown-item" (click)="quit()" routerLink="/login"> Sign-Out </a>
</li>
</ul>
</ng-container>
<ng-template #logged_out>
<ul class="dropdown-menu dropdown-menu-dark dropdown-menu-end" aria-labelledby="navbarDropdown">
<li>
<p class="dropdown-item">You are not logged in!</p>
</li>
<li><hr class="dropdown-divider"></li>
<li>
<a class="dropdown-item" routerLink="/login"> Login </a>
</li>
<li>
<a class="dropdown-item" routerLink="/signup"> Sign-Up </a>
</li>
</ul>
</ng-template>
我对 *ngIf 在 Angular 中的工作方式有疑问。我有一个导航栏组件进行检查,应该根据 true/false 响应呈现不同的列表,它在这方面工作正常,但在路由到不同页面后它停止工作,直到我再次刷新页面。
HTML:
<div *ngIf="isUserValid(); then logged_in else logged_out"></div>
<ng-template #logged_out>
<ul class="dropdown-menu dropdown-menu-dark dropdown-menu-end" aria-labelledby="navbarDropdown">
<li>
<p class="dropdown-item">You are not logged in!</p>
</li>
<li><hr class="dropdown-divider"></li>
<li>
<a class="dropdown-item" routerLink="/login"> Login </a>
</li>
<li>
<a class="dropdown-item" routerLink="/signup"> Sign-Up </a>
</li>
</ul>
</ng-template>
<!-- If user is logged in -->
<ng-template #logged_in>
<ul class="dropdown-menu dropdown-menu-dark dropdown-menu-end" aria-labelledby="navbarDropdown">
<li>
<p class="dropdown-item">Hi, [user's name]</p>
</li>
<li><hr class="dropdown-divider"></li>
<li>
<a class="dropdown-item" (click)="quit()" routerLink="/login"> Sign-Out </a>
</li>
</ul>
</ng-template>
TS(这是单击退出时发生的情况):
quit(): void{
this.is_valid_user = false;
localStorage.clear();
this.router.navigate(['login']).then(r => console.log('user quit'));
}
isUserValid(): boolean{
return this.is_valid_user;
}
当您点击注销按钮时,它应该重定向并显示已注销的块,但它什么也不显示,只有在页面刷新后才会显示。感谢任何帮助。
在angular中你必须知道一个组件被初始化一次。路由器 link 不会更改组件的状态。完全刷新再次启动 angular 生命周期。所以我假设你的“isUserValid()”只执行一次。你能提供完整的打字稿文件吗?您将“isUserValid()”方法放在哪里?
你也可以简化你的 *ngIf:
<ng-container *ngIf="isUserValid(); else logged_out">
<ul class="dropdown-menu dropdown-menu-dark dropdown-menu-end" aria-labelledby="navbarDropdown">
<li>
<p class="dropdown-item">Hi, [user's name]</p>
</li>
<li><hr class="dropdown-divider"></li>
<li>
<a class="dropdown-item" (click)="quit()" routerLink="/login"> Sign-Out </a>
</li>
</ul>
</ng-container>
<ng-template #logged_out>
<ul class="dropdown-menu dropdown-menu-dark dropdown-menu-end" aria-labelledby="navbarDropdown">
<li>
<p class="dropdown-item">You are not logged in!</p>
</li>
<li><hr class="dropdown-divider"></li>
<li>
<a class="dropdown-item" routerLink="/login"> Login </a>
</li>
<li>
<a class="dropdown-item" routerLink="/signup"> Sign-Up </a>
</li>
</ul>
</ng-template>