Angular 2- 在多个条件下使用 *ngIf
Angular 2- using *ngIf with multiple conditions
我无法在我的导航栏上有选择地显示 link。
根据登录者(用户或管理员),我想更改导航栏上显示的 link。
下面是 user/admin 注销的一个此类实例的代码。
在navbar.component.html-
<li *ngIf="authService.userLoggedIn()== true && authService.adminLoggedIn() == false"
[routerLinkActive]="['active']" [routerLinkActiveOptions]="{exact:true}">
<a (click)="onUserLogoutClick()" href="#">Logout</a>
</li>
<li *ngIf="(authService.adminLoggedIn() == true) && (authService.userLoggedIn() == false)"
[routerLinkActive]="['active']" [routerLinkActiveOptions]="{exact:true}">
<a (click)="onAdminLogoutClick()" href="#">Logout</a>
</li>
authService.adminLoggedIn()
和 authService.userLoggedIn()
return tokenNotExpired;
下面是navbar.component.ts-
中的相关代码
onUserLogoutClick() {
this.authService.userLogout();
this.flashMessage.show('You are now logged out', {cssClass: 'alert-success', timeout: 3000});
this.router.navigate(['/login']);
return false;
}
onAdminLogoutClick() {
this.authService.adminLogout();
this.flashMessage.show('Administrator now logged out', {cssClass: 'alert-success', timeout: 3000});
this.router.navigate(['/admin']);
return false;
}
authService.adminLogout()
和authService.userLogout()
只是清除存储在本地存储中的令牌。
如果我犯的错误很愚蠢,我提前道歉。我是 Angular.
的新手
您可以将这些多行条件和复杂条件移动到您的组件方法中,如下所示
showLogout(){
if(this.authService.userLoggedIn()== true && this.authService.adminLoggedIn() == false)
return true;
else
return false;
}
此外,由于 angular4 具有 *ngIf and else
,您可以将其用作
<div *ngIf="showLogout();then userLogout else adminlogout"></div>
<ng-template #userLogout><a (click)="onUserLogoutClick()" href="#">Logout</a></li></ng-template>
<ng-template #adminlogout><a (click)="onAdminLogoutClick()" href="#">Logout</a></li></ng-template>
authService.userLoggedIn() 或 authService.adminLoggedIn() 在您的表达式中不会让您的模板知道谁登录了,因为您的函数只被调用一次。
尝试让它们 getter 在您的服务中:
get userLoggedIn(): boolean {
return this.who.user; // your logic
}
然后在您的模板中:
<li *ngIf="authService.userLoggedIn && !authService.adminLoggedIn"...
我认为应该在组件中创建一个布尔属性并使用它。
而不是在模板中编写函数或复杂的表达式。
模板中的函数会降低性能。
复杂的表达式使其不可读和不可维护。
我无法在我的导航栏上有选择地显示 link。 根据登录者(用户或管理员),我想更改导航栏上显示的 link。
下面是 user/admin 注销的一个此类实例的代码。
在navbar.component.html-
<li *ngIf="authService.userLoggedIn()== true && authService.adminLoggedIn() == false"
[routerLinkActive]="['active']" [routerLinkActiveOptions]="{exact:true}">
<a (click)="onUserLogoutClick()" href="#">Logout</a>
</li>
<li *ngIf="(authService.adminLoggedIn() == true) && (authService.userLoggedIn() == false)"
[routerLinkActive]="['active']" [routerLinkActiveOptions]="{exact:true}">
<a (click)="onAdminLogoutClick()" href="#">Logout</a>
</li>
authService.adminLoggedIn()
和 authService.userLoggedIn()
return tokenNotExpired;
下面是navbar.component.ts-
中的相关代码 onUserLogoutClick() {
this.authService.userLogout();
this.flashMessage.show('You are now logged out', {cssClass: 'alert-success', timeout: 3000});
this.router.navigate(['/login']);
return false;
}
onAdminLogoutClick() {
this.authService.adminLogout();
this.flashMessage.show('Administrator now logged out', {cssClass: 'alert-success', timeout: 3000});
this.router.navigate(['/admin']);
return false;
}
authService.adminLogout()
和authService.userLogout()
只是清除存储在本地存储中的令牌。
如果我犯的错误很愚蠢,我提前道歉。我是 Angular.
的新手您可以将这些多行条件和复杂条件移动到您的组件方法中,如下所示
showLogout(){
if(this.authService.userLoggedIn()== true && this.authService.adminLoggedIn() == false)
return true;
else
return false;
}
此外,由于 angular4 具有 *ngIf and else
,您可以将其用作
<div *ngIf="showLogout();then userLogout else adminlogout"></div>
<ng-template #userLogout><a (click)="onUserLogoutClick()" href="#">Logout</a></li></ng-template>
<ng-template #adminlogout><a (click)="onAdminLogoutClick()" href="#">Logout</a></li></ng-template>
authService.userLoggedIn() 或 authService.adminLoggedIn() 在您的表达式中不会让您的模板知道谁登录了,因为您的函数只被调用一次。
尝试让它们 getter 在您的服务中:
get userLoggedIn(): boolean {
return this.who.user; // your logic
}
然后在您的模板中:
<li *ngIf="authService.userLoggedIn && !authService.adminLoggedIn"...
我认为应该在组件中创建一个布尔属性并使用它。 而不是在模板中编写函数或复杂的表达式。 模板中的函数会降低性能。 复杂的表达式使其不可读和不可维护。