【发布时间】:2019-12-15 12:03:58
【问题描述】:
我有导航栏组件,我的目标是根据用户登录显示两个不同的导航栏,即如果用户登录,他们将看到一个导航栏;如果没有,另一个。我为此目的使用 ngIf 并且一切正常,除了登录用户在手动刷新页面之前仍然可以看到未登录用户的导航栏。
import {Component, OnInit} from '@angular/core';
import {User} from '@models/user.model';
import {AuthenticationService} from '@services/auth.service';
import {Observable} from 'rxjs';
@Component({
selector: 'app-navbar',
templateUrl: './navbar.component.html',
styleUrls: ['./navbar.component.css']
})
export class NavbarComponent implements OnInit {
user: User;
authObs: Observable<User>;
constructor(private auth_service: AuthenticationService) { }
ngOnInit() {
this.authObs = this.auth_service.currentUser;
}
<nav *ngIf="authObs | async as auth; else elseBlock" class="navbar navbar-expand-lg navbar-dark bg-dark">
<div class="container">
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent"
aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav">
<li class="nav-item sub">
<a class="nav-link unselectable" (click)="gt_myprofile()"><span class="icon icon-profile"></span> my
profile</a>
</li>
<li class="nav-item sub">
<a class="nav-link unselectable" (click)="gt_messages()"><span class="icon icon-message"></span> messages
<span
class="icon-notif"></span> </a>
</li>
<li class="nav-item sub">
<a class="nav-link unselectable" (click)="gt_contacts()"><span class="icon icon-contacts"></span>
contacts<span
class="icon-notif"></span> </a>
</li>
</ul>
</div>
</div>
</nav>
<ng-template #elseBlock>
<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
<div class="container">
<a class="navbar-brand" href="#"><img src="assets/static" alt=""></a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent"
aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<!-- start navbar-nav -->
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link" href="#">about<span class="sr-only">(current)</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">cooperation</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">terms</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">contacts</a>
</li>
</ul>
</div>
</div>
</nav>
</ng-template>
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { BehaviorSubject, Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import { User } from '@models/user.model';
@Injectable({ providedIn: 'root' })
export class AuthenticationService {
private currentUserSubject: BehaviorSubject<User>;
public currentUser: Observable<User>;
constructor(private http: HttpClient) {
this.currentUserSubject = new BehaviorSubject<User>(JSON.parse(localStorage.getItem('currentUser')));
this.currentUser = this.currentUserSubject.asObservable();
}
public get currentUserValue(): User {
return this.currentUserSubject.value;
}
}
login(email: string, password: string) {
return this.http.post<any>(`${environment.apiUrl}/api/auth/`, { email, password })
.pipe(map(user => {
// store user details and jwt token in local storage to keep user logged in between page refreshes
localStorage.setItem('currentUser', JSON.stringify(user));
this.currentUserSubject.next(user);
this.currentUser = this.currentUserSubject.asObservable();
console.log("TCL: AuthenticationService -> login -> user", user)
return user;
}));
}
【问题讨论】:
-
你什么时候更新
currentUserSubject? -
抱歉,我应该如何以及何时更新它?用户登录后?
-
好吧,如果你想让消耗 observable 的东西获得新值,那将是这样做的好时机。
-
我添加了一个答案,我在其中展示了如何添加一种方法来更新已登录用户的值。
-
尝试清除本地存储。您是否在注销时从本地存储中调用 removeItem?我没有在您的服务中看到注销功能。如果本地存储为空,您的代码应该可以工作
标签: angular