![](/img/trans.png)
[英]ExpressionChangedAfterItHasBeenCheckedError in ngIf?
[英]ngIf ExpressionChangedAfterItHasBeenCheckedError
我正在尝试从我的 Angular 6 应用程序的导航栏菜单中隐藏登录项。 我有一个像下面这样的AuthService
:
import { Injectable, Inject } from '@angular/core';
import { BehaviorSubject } from 'rxjs';
import { map } from 'rxjs/operators';
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { JwtHelperService } from '@auth0/angular-jwt';
@Injectable({
providedIn: 'root'
})
export class AuthService {
private url: string;
private loggedIn = new BehaviorSubject<boolean>(false);
isLoggedIn$ = this.loggedIn.asObservable();
constructor(private http: HttpClient, private jwtHelper: JwtHelperService, @Inject('BASE_URL') baseUrl: string) {
this.url = baseUrl + 'api/auth';
this.loggedIn.next(this.isLoggedIn());
}
login(credentials) {
const headers = new HttpHeaders({ 'Content-Type': 'application/json' });
return this.http.post<any>(`${this.url}/login`, JSON.stringify(credentials), { headers: headers }).pipe(
map(response => {
if (response && response.token) {
localStorage.setItem('token', response.token);
this.loggedIn.next(true);
return true;
}
return false;
})
);
}
logout() {
localStorage.removeItem('token');
this.loggedIn.next(false);
}
isLoggedIn() {
return !this.jwtHelper.isTokenExpired();
}
}
这是我在NavMenuComponent
:
export class NavMenuComponent implements OnInit, OnDestroy {
isExpanded = false;
isLoggedIn: boolean;
authSubscription: Subscription;
constructor(private router: Router, private authService: AuthService) {}
ngOnInit() {
this.authSubscription = this.authService.isLoggedIn$
.subscribe(loggedIn => this.isLoggedIn = loggedIn);
}
ngOnDestroy() {
this.authSubscription.unsubscribe();
}
onLogout() {
this.authService.logout();
this.router.navigate(['/login']);
}
collapse() {
this.isExpanded = false;
}
toggle() {
this.isExpanded = !this.isExpanded;
}
}
而且,这是 html:
<li *ngIf="!isLoggedIn" class="nav-item" [routerLinkActive]="['link-active']">
<a class="nav-link" [routerLink]="['/login']">Login</a>
</li>
但是,当我运行它时,出现以下错误:
错误:ExpressionChangedAfterItHasBeenCheckedError:检查后表达式已更改。 以前的值:'ngIf: true'。 当前值:'ngIf:false'。
我确实读过这个错误,但我不明白如何解决它。 有什么帮助吗?
我的猜测是,它与您设置的初始值的方式做loggedIn
在服务的构造函数: this.loggedIn.next(this.isLoggedIn());
尝试仅在您的类中声明变量,并仅在您的构造函数中将其设为new BehaviourSubject()
。
就像是:
private url: string;
private loggedIn: BehaviorSubject<boolean>;
isLoggedIn$: Observable<boolean>;
constructor(private http: HttpClient, private jwtHelper: JwtHelperService, @Inject('BASE_URL') baseUrl: string) {
this.url = baseUrl + 'api/auth';
this.loggedIn = new BehaviourSubject<boolean>(this.isLoggedIn());
this.isLoggedIn$ = this.loggedIn.asObservable()
}
如果这有什么改变,请告诉我
您尝试使用方法而不是属性来返回 AuthService 上的可观察对象
isLoggedIn: BehaviorSubject<boolean> = new BehaviorSubject(false);
isLoggedIn$() {
return this.isLoggedIn.asObservable();
}
您可以使用 setTimeout 解决此错误。
export class NavMenuComponent implements OnInit, OnDestroy {
isExpanded = false;
isLoggedIn: boolean;
authSubscription: Subscription;
constructor(private router: Router, private authService: AuthService) {}
ngOnInit() {
setTimeout(() => {
this.authSubscription = this.authService.isLoggedIn$
.subscribe(loggedIn => this.isLoggedIn = loggedIn);
});
}
ngOnDestroy() {
this.authSubscription.unsubscribe();
}
onLogout() {
this.authService.logout();
this.router.navigate(['/login']);
}
collapse() {
this.isExpanded = false;
}
toggle() {
this.isExpanded = !this.isExpanded;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.