angular - 将 Ngclass 与 obervable 一起使用
问题描述
我想知道什么是可观察的身份验证时的最佳实践。如果用户未登录,我的代码部分需要呈现不同的代码。目前我正在使用 "*ngIf="accountService.currentUser$ | 异步”每次我需要根据登录状态区分代码时。
可以使用 "*ngIf="accountService.currentUser$ | async”在同一页面上多次或以不同方式处理?
我需要区分的地方之一是我想使用 [ngClass] 根据登录状态更改 CSS 类。最好的方法是什么?
account.service.ts:
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { ReplaySubject } from 'rxjs';
import { map } from 'rxjs/operators';
import { User } from '../_models/user';
@Injectable({
providedIn: 'root'
})
export class AccountService {
baseUrl = 'https://localhost:5001/api/';
private currentUserSource = new ReplaySubject<User | null>(1);
currentUser$ = this.currentUserSource.asObservable();
constructor(private http: HttpClient) { }
login(model: any) {
return this.http.post<User>(this.baseUrl + 'account/login', model).pipe(
map((response: User) => {
const user = response;
if (user) {
localStorage.setItem('user', JSON.stringify(user));
this.currentUserSource.next(user);
}
})
)
}
setCurrentUser(user: User) {
this.currentUserSource.next(user);
}
logout() {
localStorage.removeItem('user');
this.currentUserSource.next(null);
}
register(model: any) {
return this.http.post<User>(this.baseUrl + 'account/register', model).pipe(
map((user: User) => {
if (user) {
localStorage.setItem('user', JSON.stringify(user));
this.currentUserSource.next(user);
}
})
)
}
}
app.component.ts:
import { HttpClient } from '@angular/common/http';
import { Component, OnInit } from '@angular/core';
import { User } from './_models/user';
import { AccountService } from './_services/account.service';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
title = 'Admin Cockpit';
users: any;
isLoggedIn = true;
constructor(private http: HttpClient, public accountService: AccountService){}
ngOnInit() {
this.setCurrentUser();
}
setCurrentUser() {
const user: User = JSON.parse(localStorage.getItem('user')!);
this.accountService.setCurrentUser(user);
}
}
app.cmponent.html:
<app-preloader></app-preloader>
<ng-container *ngIf="accountService.currentUser$ | async" >
<app-nav></app-nav>
<app-sidebar></app-sidebar>
</ng-container>
<!-- Content Wrapper. Contains page content -->
<div [ngClass]="{'content-wrapper': isLoggedIn, 'content-wrapper-login': !isLoggedIn}">
<!-- Content Header (Page header) -->
<div class="content-header">
<div class="container-fluid">
<div class="row mb-2">
<div class="col-sm-6">
<h1 class="m-0">Main</h1>
</div><!-- /.col -->
</div><!-- /.row -->
</div><!-- /.container-fluid -->
</div>
<!-- /.content-header -->
<!-- Main content -->
<section class="content">
<div class="container-fluid">
<router-outlet></router-outlet>
</div><!-- /.container-fluid -->
</section>
<!-- /.content -->
</div>
<app-footer></app-footer>
解决方案
我想我自己找到了一个可行的答案。
<div [ngClass]="{'content-wrapper': (accountService.currentUser$ | async) != null, 'content-wrapper-login': (accountService.currentUser$ | async) === null}">
似乎完成了这项工作。
推荐阅读
- ios - 如何使用 Alamofire 将跑步上传到 Strava 运动员的个人资料
- java - Docker Compose 出现异常
- javascript - Chrome浏览器禁用了flash插件,导致我使用jwplayer插件提示“找不到合适的播放器!”。我怎么解决这个问题?
- netflix-feign - 调用 netflix FeignClient 时未保留 Trace Id
- node.js - 如何在没有 express 的情况下使用 Multer
- nlp - Ruta 中的字符串连接
- django - 无论输入如何,Django ModelChoiceField 查询集都会返回相同的结果
- c# - 如何在注册页面 C# MVC 上使用 Cosmos DB 数据填充下拉值?
- typescript - 为什么我不能从已经省略的类型中省略属性?
- ios - 通用链接在 iOS 12.2、12.3 中不起作用