如何在 Angular 10 中的 Angular 组件中显示数据?
How can I show data in an Angular component in Angular 10?
我从 Angular 10 开始,我想将当前用户放在 profile.component.html 中,将导航栏放在 app.component.html 中。这是代码。
users.ts
export interface User {
username : string
password: string
edad: number
fechaNacimiento: string
createdAt?: string
updatedAt?: string
id?:number
}
login.component.ts
import { Component, OnInit } from '@angular/core';
import { NgForm } from '@angular/forms';
import { ActivatedRoute, Router } from '@angular/router';
import { UsersService } from 'src/app/services/users.service';
@Component({
selector: 'app-login',
templateUrl: './login.component.html',
styleUrls: ['./login.component.css']
})
export class LoginComponent implements OnInit {
constructor(
public usersServices: UsersService,
private router: Router
) { }
ngOnInit(): void {
}
login(form: NgForm){
this.usersServices.login(form.value).subscribe(
res => {
console.log(res);
localStorage.setItem('token',res['token']);
this.router.navigate(['/profile',form.controls['username'].value],{
state:{username:form.controls['username']}
});
},
err => {
console.log(err)
}
)
}
}
profile.component.ts
import { Component, OnInit } from '@angular/core';
import { UsersService } from '../../services/users.service';
import { NgForm } from '@angular/forms';
import { User } from 'src/app/models/users';
import { ActivatedRoute } from '@angular/router';
@Component({
selector: 'app-profile',
templateUrl: './profile.component.html',
styleUrls: ['./profile.component.css']
})
export class ProfileComponent implements OnInit {
constructor(public usersService: UsersService,private route: ActivatedRoute) {
this.route.params.subscribe(username => {
console.log(username);
})
}
ngOnInit(): void {
this.getUsers();
}
getUsers(){
this.usersService.getUsers().subscribe(
res => {
this.usersService.user = res
},
err => console.log(err)
)
}
deleteUser(id:number){
if(confirm('Are you sure you want to delete it?')){
this.usersService.deleteUser(id).subscribe(
(res) => {
this.getUsers();
},
(err) => console.log(err)
);
}
}
updateUser(form: NgForm){
this.usersService.editUser(form.value).subscribe(
res => console.log(res),
err => console.log(err)
);
}
}
<div class="col-md-8">
<table class="table table-striped">
<thead>
<tr>
<th>Username</th>
<th>Age</th>
<th>Birthdate</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let user of usersService.user">
<td>{{user.username}}</td>
<td>{{user.edad}}</td>
<td>{{user.fechaNacimiento}}</td>
<td>
<button class="btn btn-secondary btn-sm" data-toggle="modal" data-target="#staticBackdrop">
<i class="material-icons">edit</i>
</button>
<button class="btn btn-danger btn-sm" (click)="deleteUser(user.id)">
<i class="material-icons">delete</i>
</button>
</td>
</tbody>
</table>
</div>
app.component.html
<nav class="navbar navbar-dark bg-dark">
<div class="container">
<a class="navbar-brand" href="#">MEAN Users</a>
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link" routerLink="/profile" routerLinkActive = "active">Profile</a>
</li>
</ul>
<ul class="navbar-nav ml-auto">
<ng-container *ngIf="!usersService.loggedIn(); else loggedIn">
<li class="nav-item">
<a class="nav-link" routerLink="/register" routerLinkActive = "active">Signup</a>
</li>
<li class="nav-item">
<a class="nav-link" routerLink="/login" routerLinkActive = "active">Signin</a>
</li>
</ng-container>
<ng-template #loggedIn>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" data-toggle="dropdown" role="button" style="cursor: pointer;"></a>
<div class="dropdown-menu">
<a class="dropdown-item" (click)="usersService.logout()">Logout</a>
</div>
</li>
</ng-template>
</ul>
</div>
</nav>
<div class="container p-5">
<router-outlet></router-outlet>
</div>
我想在 app.component.html 和 profile.component.html 的导航栏中放置一个用户,但我不知道该怎么做。
先谢谢大家了
这个问题我不是很清楚,但我想这可能对你有帮助。
最好创建一个身份验证服务。认证服务用于登录和退出,当用户登录和退出时通知其他组件,并允许访问当前登录的用户。
RxJS Subjects 和 Observables 用于存储当前用户对象,并在用户登录和退出应用时通知其他组件。 Angular 组件可以 subscribe()
到 public currentUser: Observable
属性 被通知更改,并且在调用 this.currentUserSubject.next()
方法时发送通知login()
和 logout()
方法,将参数传递给每个订阅者。
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { BehaviorSubject, Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import { User } from '@app/_models';
@Injectable({ providedIn: 'root' })
export class AuthenticationService {
private currentUserSubject: BehaviorSubject<User>;
public currentUser: Observable<User>;
apiUrl: string;
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(username: string, password: string) {
return this.http.post<any>(`${this.apiUrl}/users/authenticate`, { username, 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);
return user;
}));
}
logout() {
// remove user from local storage to log user out
localStorage.removeItem('currentUser');
this.currentUserSubject.next(null);
}
}
你可以像这样使用当前用户
currentUser: User;
constructor(
private authenticationService: AuthenticationService
) {
this.authenticationService.currentUser.subscribe(x => this.currentUser = x);
}
如果当前用户未定义,您可以再次导航到登录页面。如果不是你可以显示当前用户。
我从 Angular 10 开始,我想将当前用户放在 profile.component.html 中,将导航栏放在 app.component.html 中。这是代码。
users.ts
export interface User {
username : string
password: string
edad: number
fechaNacimiento: string
createdAt?: string
updatedAt?: string
id?:number
}
login.component.ts
import { Component, OnInit } from '@angular/core';
import { NgForm } from '@angular/forms';
import { ActivatedRoute, Router } from '@angular/router';
import { UsersService } from 'src/app/services/users.service';
@Component({
selector: 'app-login',
templateUrl: './login.component.html',
styleUrls: ['./login.component.css']
})
export class LoginComponent implements OnInit {
constructor(
public usersServices: UsersService,
private router: Router
) { }
ngOnInit(): void {
}
login(form: NgForm){
this.usersServices.login(form.value).subscribe(
res => {
console.log(res);
localStorage.setItem('token',res['token']);
this.router.navigate(['/profile',form.controls['username'].value],{
state:{username:form.controls['username']}
});
},
err => {
console.log(err)
}
)
}
}
profile.component.ts
import { Component, OnInit } from '@angular/core';
import { UsersService } from '../../services/users.service';
import { NgForm } from '@angular/forms';
import { User } from 'src/app/models/users';
import { ActivatedRoute } from '@angular/router';
@Component({
selector: 'app-profile',
templateUrl: './profile.component.html',
styleUrls: ['./profile.component.css']
})
export class ProfileComponent implements OnInit {
constructor(public usersService: UsersService,private route: ActivatedRoute) {
this.route.params.subscribe(username => {
console.log(username);
})
}
ngOnInit(): void {
this.getUsers();
}
getUsers(){
this.usersService.getUsers().subscribe(
res => {
this.usersService.user = res
},
err => console.log(err)
)
}
deleteUser(id:number){
if(confirm('Are you sure you want to delete it?')){
this.usersService.deleteUser(id).subscribe(
(res) => {
this.getUsers();
},
(err) => console.log(err)
);
}
}
updateUser(form: NgForm){
this.usersService.editUser(form.value).subscribe(
res => console.log(res),
err => console.log(err)
);
}
}
<div class="col-md-8">
<table class="table table-striped">
<thead>
<tr>
<th>Username</th>
<th>Age</th>
<th>Birthdate</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let user of usersService.user">
<td>{{user.username}}</td>
<td>{{user.edad}}</td>
<td>{{user.fechaNacimiento}}</td>
<td>
<button class="btn btn-secondary btn-sm" data-toggle="modal" data-target="#staticBackdrop">
<i class="material-icons">edit</i>
</button>
<button class="btn btn-danger btn-sm" (click)="deleteUser(user.id)">
<i class="material-icons">delete</i>
</button>
</td>
</tbody>
</table>
</div>
app.component.html
<nav class="navbar navbar-dark bg-dark">
<div class="container">
<a class="navbar-brand" href="#">MEAN Users</a>
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link" routerLink="/profile" routerLinkActive = "active">Profile</a>
</li>
</ul>
<ul class="navbar-nav ml-auto">
<ng-container *ngIf="!usersService.loggedIn(); else loggedIn">
<li class="nav-item">
<a class="nav-link" routerLink="/register" routerLinkActive = "active">Signup</a>
</li>
<li class="nav-item">
<a class="nav-link" routerLink="/login" routerLinkActive = "active">Signin</a>
</li>
</ng-container>
<ng-template #loggedIn>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" data-toggle="dropdown" role="button" style="cursor: pointer;"></a>
<div class="dropdown-menu">
<a class="dropdown-item" (click)="usersService.logout()">Logout</a>
</div>
</li>
</ng-template>
</ul>
</div>
</nav>
<div class="container p-5">
<router-outlet></router-outlet>
</div>
我想在 app.component.html 和 profile.component.html 的导航栏中放置一个用户,但我不知道该怎么做。
先谢谢大家了
这个问题我不是很清楚,但我想这可能对你有帮助。 最好创建一个身份验证服务。认证服务用于登录和退出,当用户登录和退出时通知其他组件,并允许访问当前登录的用户。
RxJS Subjects 和 Observables 用于存储当前用户对象,并在用户登录和退出应用时通知其他组件。 Angular 组件可以 subscribe()
到 public currentUser: Observable
属性 被通知更改,并且在调用 this.currentUserSubject.next()
方法时发送通知login()
和 logout()
方法,将参数传递给每个订阅者。
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { BehaviorSubject, Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import { User } from '@app/_models';
@Injectable({ providedIn: 'root' })
export class AuthenticationService {
private currentUserSubject: BehaviorSubject<User>;
public currentUser: Observable<User>;
apiUrl: string;
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(username: string, password: string) {
return this.http.post<any>(`${this.apiUrl}/users/authenticate`, { username, 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);
return user;
}));
}
logout() {
// remove user from local storage to log user out
localStorage.removeItem('currentUser');
this.currentUserSubject.next(null);
}
}
你可以像这样使用当前用户
currentUser: User;
constructor(
private authenticationService: AuthenticationService
) {
this.authenticationService.currentUser.subscribe(x => this.currentUser = x);
}
如果当前用户未定义,您可以再次导航到登录页面。如果不是你可以显示当前用户。