2017-08-18 11 views
0

説明しましょう。ここでは、このように私のメッセージを表示するように私のHTMLです:Subject変数をObservable変数に変換する方法

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

マイthread.messages変数が観測されます。私addNewMessage()機能で

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

、私は、新しいメッセージを追加する対象の変数を作成しました:私はthread.messagesにこのsubjectMessages変数を変換したい

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

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

変数。 しかし、それは動作しません。私のthread.messages変数にObservableが含まれていますが、HTMLに何も表示されません。

しかし、最後のメッセージの表示は動作します。私のミスは次のようになりどこ

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

私は絶望、あなたは知っていますか?すべてのメッセージではなく、最後のメッセージを表示できますか?

+0

return subjectMessages.asObservable(); – alehn96

+0

@ alehn96 どういう意味ですか? どこで 'subjectMessages.asObservable()'を返すのですか? – Floriane

答えて

1

この場合、加入者に何が入っているのかを状態と考えてください。あなたのコードでは、配列内にラップされた単一のメッセージ[newMessage]を出します。サブスクライバは、これらの放出された値をストリームとして取得します。状態全体を送信すると、サブスクライバはメッセージ全体にアクセスできます。

SubjectとObservableの両方を使用することは正しいとは思われません。

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); 
} 

それとも、より良いアプローチは、同様に以前のメッセージを取得するために使用することができReplaySubjectまたはBehaviorSubjectを見て次のようになります。あなたの代わりにこのような何かを行う場合、私はおそらくこれを試みたが、していません。

+0

ありがとう! これは次のように動作します: 'messages.push(newMessage); thread.messages = Observable.of(thread.arrayMessages); ' – Floriane

関連する問題