[英]enable Logout button only after Login in Angular 7
我僅在登錄https://stackblitz.com/edit/angular-login-hide-navbar-ngif后才引用以下鏈接來啟用注銷按鈕
我只想在用戶登錄后才在導航欄中顯示“注銷”,我正在通過從“身份驗證服務”中調用“ this.authservice.isUserLoggedIn”並將其分配給變量並寫入一個來驗證用戶是否登錄“注銷”鏈接附近的ngif
條件。 我已經使用BehaviourSubject來獲取當前狀態。 但是我不知道為什么代碼不起作用,並且總是返回false,因此即使用戶登錄后也無法啟用“注銷”鏈接
我有header.component.ts
export class CommonheaderComponent implements OnInit {
constructor(private authservice : AuthenticationService) { }
isLoggedIn$ : Observable<boolean>;
ngOnInit() {
this.isLoggedIn$ = this.authservice.isUserLoggedIn;
}
}
我有如下的header.component.html
<ul class="nav navbar-nav">
<li><a [routerLink]='["/search"]'>Search <span class="slider"></span></a></li>
<li *ngIf="isLoggedIn"><a (click)="logout()">Logout</a></li>
</ul>
以下是login.component.ts
export class LoginComponent implements OnInit {
isLoggedIn : Observable<boolean>;
ngOnInit() {
this.isLoggedIn = this.authservice.isUserLoggedIn;
this.loginForm = this.formbuilder.group({
username : ['', Validators.required],
password : ['', Validators.required]
})
}
}
onSubmit(){
this.authservice.login(this.loginForm.value).subscribe(data => {
})
}
}
我有以下身份驗證服務
import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { BehaviorSubject, Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import { User } from '../_models/user';
import { Router } from '@angular/router';
const httpOptions = {
headers : new HttpHeaders({'Content-type' : 'application/json'})
}
@Injectable({
providedIn: 'root'
})
export class AuthenticationService {
private currentUserSubject : BehaviorSubject<User>;
private currentUser : Observable<User>;
private loggedIn: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false);
constructor(private http: HttpClient, private router: Router) {
this.currentUserSubject = new BehaviorSubject<User>(JSON.parse(localStorage.getItem('currentUser')));
this.currentUser = this.currentUserSubject.asObservable();
}
public get currentUserValue(): User{
return this.currentUserSubject.value;
}
public login(user: User):Observable<any>{
var baseUrl = "http://localhost:3000/";
return this.http.post<any>(baseUrl+'auth/login', user, httpOptions).pipe(map(user => {
if(user && user.accesstoken){
localStorage.setItem('currentUser', JSON.stringify(user));
this.currentUserSubject.next(user);
this.loggedIn.next(true);
}else{
return false;
}
return user;
}))
}
get isUserLoggedIn(){
return this.loggedIn.asObservable();
}
}
我在哪里犯錯了。 或為此的解決方案/替代方案。 請幫忙!!
很久以來我一直堅持
您可以像這樣更改模板后嘗試:
<ul class="nav navbar-nav">
<li><a [routerLink]='["/search"]'>Search <span class="slider"></span></a></li>
<li *ngIf="isLoggedIn$ | async"><a (click)="logout()">Logout</a></li>
</ul>
注意async
管道解包了可觀察的值。
請注意,在您共享的stackblitz示例中-可觀察的值已使用async
管道展開-
<mat-toolbar color="primary" *ngIf="isLoggedIn$ | async as isLoggedIn">
對於您的最后一條評論,這是因為服務正在重新初始化並且您的觀察值已被重置。 將此添加到您的構造函數
if(localStorage.getItem('currentUser') != null)
this.loggedIn.next(true);
這對我有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.