2017-05-17 1 views
0

Ich habe eine angular2 Anwendung, in der ich eine Login-Seite haben. Nach der Anmeldung möchte ich den Benutzernamen in der Header-Komponente anzeigen.zu teilen Daten zwischen Services und Komponenten

@Output() getUserName = new EventEmitter(); 

im Authentifizierungsmethode Service

authenticate(loginRequest) { 
    let headers = new Headers({ 'Content-Type' : 'application/json' }); 
    let options = new RequestOptions({ headers: headers }); 
    let authenticateResp = this.http.post("http://localhost:8080/authenticate", JSON.stringify(loginRequest), options).map(result => result.json()); 
    authenticateResp.subscribe((authenticate => { 
     this.getUserName.emit("My Name"); 
    }));  

    return authenticateResp; 
} 

In der Header-Komponente in Konstruktor

@Component({ 
..... 
providers:[LoginService] 
}) 
export class HeaderComponent { 
    userName : string; 
    constructor(private loginService : LoginService) { 

     loginService.getUserName.subscribe(authenticated => this.setName(authenticated)); 
    } 

    setName(authenticated) { 
    this.userName = authenticated; 
    } 

} 

Wenn ich debuggen, kann ich das Ereignis Emissions Code immer ausgeführt, aber der Code in subscribe in der Komponente wird nicht aufgerufen. Was mache ich hier falsch?

Jede mögliche Hilfe schätzen

+0

Ich schlage vor, Sie, diese Frage zu prüfen: http://stackoverflow.com/questions/36076700/what-is-the-proper-use- of-an-eventemitter, sollten Sie nicht '@ Output' in Ihre Dienste – echonax

Antwort

3

@Output() und EventEmitter nicht dazu gedacht sind, in einem Dienst verwendet werden, da sie designed for inter-component communication sind.

EventEmitter ist (vorerst) eine Unterklasse von Subject, ein Standard-Subject, wird nicht den letzten emittierten Wert im Speicher halten, so dass, wenn ein Wert ausgegeben wird, während kein Teilnehmer ist, wurde der Wert einfach ignoriert.

A ReplaySubject wird der zuletzt emittierten Wert zu jedem neuen Teilnehmer wiederholen.

Hinweise:

  • es ist eine gute Praxis nur Observable statt Subject aussetzen.
  • Sie möchten nicht authenticateResp innerhalb Ihrer authenticate-Methode abonnieren und authenticateResp zur gleichen Zeit zurückgeben, da dies die Anforderung zweimal auslöst, wenn Sie den zurückgegebenen Wert abonnieren. Sie sollten den Operator do() verwenden, das Observable zurückgeben und abonnieren, wo Sie diese Daten benötigen.
private _userName = new ReplaySubject<string>(); 

userName=this._userName.asObservable(); 

authenticate(loginRequest) { 
    let headers = new Headers({ 'Content-Type' : 'application/json' }); 
    let options = new RequestOptions({ headers: headers }); 
    return this.http.post("http://localhost:8080/authenticate", JSON.stringify(loginRequest), options) 
     .map(result => result.json()) 
     .do((authenticate => this._userName.next("My Name")));  
} 

und innerhalb Ihrer Komponente:

loginService.userName.subscribe(authenticated => this.setName(authenticated)); 
+0

verwende ich schon versucht, diese, abonnieren das Verfahren noch in der Komponente in wird – ConfusionPrevails

+0

wird' authenticate' irgendwo genannt nicht ausgeführt? – n00dl3

+0

Ja, der Authentifizierungsdienst wird von einer Komponente aufgerufen. Es wird ohne Probleme ausgeführt. – ConfusionPrevails

Verwandte Themen