我正在开发一个 Angular 2+ 应用程序。我发现在 AngularJS 中实现相对简单的东西非常困难。
我希望我的顶部导航LOG IN在用户未登录和登录时显示一个按钮LOG OUT。
我一直在尝试各种事情,但我无法让它正常工作。我希望它在整个应用程序中始终如一地工作,并且无论重新加载(它存储isLoggedIn
到localStorage
)
我目前的实现根本不起作用,但我会在这里分享它,这样你就可以告诉我我是否至少在正确的轨道上某个地方。
顶部导航.component.html
<p class="nav-item my-2 my-lg-0" *ngIf="!isLoggedIn | async"><a class="nav-link" routerLink="/login" routerLinkActive="active">Login</a></p>
<p class="nav-item my-2 my-lg-0" *ngIf="isLoggedIn | async"><a class="nav-link" routerLink="//logout" routerLinkActive="active">Logout</a></p>
顶部导航.component.ts
export class TopNavigationComponent implements OnInit {
@ViewChild('topnav') topnav: ElementRef;
//isLoggedIn: boolean;
isLoggedIn: Observable<Boolean>;
constructor( private authService: AuthService, private logger: LoggerService ) { }
ngOnInit() {
this.isLoggedIn = this.authService.getIsLoggedIn();
}
auth.service.ts
@Injectable()
export class AuthService {
loggedIn$: Subject<Boolean> = new Subject<Boolean>();
constructor(private logger: LoggerService) {
let isLoggedInLocalStore = (localStorage.getItem('isLoggedIn') === 'true');
if (!isLoggedInLocalStore) {
isLoggedInLocalStore = false;
localStorage.setItem('isLoggedIn', isLoggedInLocalStore.toString());
}
}
getIsLoggedIn(): Observable<Boolean> {
//return (localStorage.getItem('isLoggedIn') === 'true');
return this.loggedIn$.asObservable();
}
login(): void {
// TODO
this.logger.log("AuthService | Login clicked...");
localStorage.setItem('isLoggedIn', 'true');
this.loggedIn$.next(true);
}
logout() {
// TODO
localStorage.setItem('isLoggedIn', 'false');
this.loggedIn$.next(false);
}
}