Ich habe erfolgreich einen Login-Service für meine Angular 2 App implementiert. Ich möchte jetzt den Benutzernamen des angemeldeten Benutzers aus dieser Komponente einer separaten Komponente zur Verfügung stellen - speziell der Chat-Komponente. So kann ich den Namen des Benutzers anzeigen, wenn er mit einem anderen Benutzer chattet. Ich bin immer noch ein wenig verschwommen, wie Sie Werte wie diese von einer Komponente zur anderen in Angular 2. Hier passieren Sie den Code aus Anmeldungs Komponente ist:Angular2: Wert von einer Komponente an eine andere übergeben
import { AuthenticationService } from './../../data/authentication.service';
import { AlertService } from './../../data/alert.service';
import { Component, OnInit, Output } from '@angular/core';
import { Router } from '@angular/router';
@Component({
selector: 'app-login',
templateUrl: 'app/views/login/login.component.html',
styleUrls: ['app/views/login/login.component.css']
})
export class LoginComponent implements OnInit {
//@Output() username;
model: any = {};
loading = false;
constructor(
private router: Router,
private authenticationService: AuthenticationService,
private alertService: AlertService) { }
ngOnInit() {
// reset login status
this.authenticationService.logout();
}
login() {
this.loading = true;
this.authenticationService.login(this.model.username, this.model.password)
.subscribe(
data => {
this.router.navigate(['/']);
console.log('User logged in as: ' + this.model.username);
},
error => {
this.alertService.error(error);
this.loading = false;
});
}
reqPasswordReset() {
let popup = document.getElementById('myPopup');
popup.classList.toggle('show');
}
}
Diese Komponente nutzen einen Authentifizierungsdienst, der aussieht wie folgt:
import { LoginComponent } from './../views/login/login.component';
import { ContextMenu } from './../ui/context-menu.component';
import { Router, RouterLinkActive } from '@angular/router';
import { Injectable } from '@angular/core';
import { Http, Headers, Response } from '@angular/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/map';
@Injectable()
export class AuthenticationService {
constructor(private http: Http) {}
login(username: string, password: string) {
return this.http.post('/api/authenticate', JSON.stringify({ username: username, password: password }))
.map((response: Response) => {
// login successful if there's a jwt token in the response
let user = response.json();
if (user && user.token) {
// store user details and jwt token in local storage to keep user logged in between page refreshes
localStorage.setItem('currentUser', JSON.stringify(user));
}
});
}
isAuthenticated() {
if (localStorage.getItem('currentUser')) {
//console.log('User successfully authenticated...');
return true;
} else {
// console.log('User is not authenticated...');
return false;
}
}
logout() {
// remove user from local storage to log user out
localStorage.removeItem('currentUser');
console.log('User successfully logged out');
}
}
Ich bin in der Lage, erfolgreich auf der Konsole den Benutzernamen zu loggen, damit ich weiß, dass ich diesen Wert festhalte. Was ich möchte, ist jetzt zu tun, diesen Wert gehen von „this.model.username“ in mein Zimmer Komponente, die derzeit wie folgt aussieht:
import { ChatService } from './../chat/chat.service';
import { User } from './../../views/user/user';
import { Component, OnInit, Input } from '@angular/core';
import { AuthenticationService } from './../../data/authentication.service';
import { Http, Headers, Response } from '@angular/http';
import { Router } from '@angular/router';
@Component({
selector: 'app-room',
templateUrl: './room.component.html',
styleUrls: ['./room.component.less']
})
export class RoomComponent implements OnInit {
otherImg = 'app/img/photo-ph.png';
// otherImg = 'app/img/portrait-place-holder.svg';
model: any;
loading = false;
others = [
{ id: 1, name: 'John Smith', avatar: 'app/img/photo-ph.png' },
{ id: 2, name: 'Javier Sanchez', avatar: 'app/img/photo-ph.png' }
];
user;
token;
name;
nickname;
constructor(private authenticationService: AuthenticationService,
private router: Router,
private http: Http,
private chatService: ChatService) { }
isLoggedIn() {
this.loading = true;
if (this.authenticationService.isAuthenticated()) {
return true;
}
}
gotoChat() {
this.chatService.gotoChat(this.user);
}
ngOnInit() {
}
}
Die Ansicht für diese Komponente wird Schleife Benutzer (andere) und Anzeigen eines Symbols für jeden "anderen" Benutzer. Hier ist der Code:
<div *ngIf="isLoggedIn()" class="others">
<span *ngFor="let other of others"><i [ngClass]="'material-icons'" (click)="gotoChat()" [routerLink]="['/chat']">person</i></span>
<a [routerLink]="['/login']">Logout</a>
</div>
Das ultimative Ziel ist es für Menschen, andere zu sehen, die angemeldet sind, und in der Lage einen Chat mit ihnen zu initiieren.
Wo ich feststecke ist in, wie übergeben Sie den Wert (this.model.username), den ich in der Login-Komponente erfassen, bis auf die Zimmer-Komponente.
https://angular.io/docs/ts/latest/cookbook/component-communication.html – echonax
Sie eine Methode in Ihrem 'AuthenticationService' hinzufügen, Wie lautet der aktuelle Benutzername, den Sie zurückgeben, wenn der Benutzer authentifiziert wird? –
Danke, aber ich habe den Benutzernamen, weil, wie ich schon sagte, ich in der Lage bin, es zu loggen. Meine Frage ist, wie man es von einer Komponente zur anderen übergibt. – Muirik