2017-08-18 4 views
0

Lassen Sie mich erklären. Hier ist mein HTML meine Meldungen wie diese angezeigt werden:Wie man eine Subject-Variable in eine Observable-Variable konvertiert

<message 
    *ngFor="let message of thread.messages | async" 
    [message]="message"> 
</message> 

Mein thread.messages Variable ein beobachtbar ist.

export class Thread { 
    id: string; 
    messages: Observable<Message[]> = new Observable<Message[]>(); 
} 

In meinem addNewMessage() Funktion, habe ich ein Thema Variable, um die neuen Nachrichten in hinzuzufügen:

subjectMessages: Subject<Message[]> = new Subject<Message[]>(); 

addNewMessage(objMessage: any) : void { 
    const newMessage = new Message(objMessage); 
    this.subjectMessages.next([newMessage]); 
    thread.messages = this.subjectMessages.asObservable(); 
} 

ich diesem subjectMessages Variable auf den thread.messages konvertieren möchten Variable. Aber es funktioniert nicht. Meine thread.messages Variable enthält ein Observable, aber es zeigt nichts in meinem HTML an.

jedoch die Anzeige der letzten Nachricht funktioniert:

thread.messages.subscribe((message: Message[]) => { 
     [thread.lastMessage] = message; 
}); 

ich verzweifle, weißt du, wo mein Fehler sein würde? Warum kann ich die letzte Nachricht und nicht alle Nachrichten anzeigen?

+0

zurück subjectMessages.asObservable(); – alehn96

+0

@ alehn96 Was meinst du? Wo soll ich 'subjectMessages.asObservable()' zurückgeben? – Floriane

Antwort

1

In diesem Fall, was Sie in einem Abonnenten als Staat erhalten. In Ihrem Code senden Sie eine einzelne Nachricht in einem Array, [newMessage]. Die Teilnehmer erhalten diese emittierten Werte als Stream. Wenn Sie den gesamten Status ausgeben, erhalten die Abonnenten Zugriff auf das gesamte Nachrichtenfeld.

Es scheint nicht richtig zu sein, ein Subjekt und ein Observable zu verwenden. Ich habe nicht versucht, aber vielleicht, wenn Sie so etwas tun, statt:

export class Thread { 
    id: string; 
    messages: Subject<Message[]> = new Subject<Message[]>(); 
} 

messages: Message[] = new Message[]; 

addNewMessage(objMessage: any) : void { 
    const newMessage = new Message(objMessage); 
    messages.push(newMessage); 
    thread.messages.next(messages); 
} 

Oder vielleicht ein besserer Ansatz wäre, bei ReplaySubject oder BehaviorSubject suchen, die verwendet werden können, wie auch frühere Mitteilungen zu erhalten.

+0

Vielen Dank !! Es funktioniert damit: 'messages.push (newMessage); thread.messages = Observable.of (thread.arrayMessages); ' – Floriane

Verwandte Themen