2017-08-18 28 views
0

讓我解釋一下。這是我的HTML顯示像這樣我的消息:如何將Subject變量轉換爲Observable變量

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

thread.messages變量是可觀察到的。

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

在我addNewMessage()函數,我創建了一個主題變量中添加新的消息:

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

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

我想變量轉換這個subjectMessages到thread.messages變量。 但它不起作用。我的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); 
} 

或者也許是更好的辦法是看ReplaySubjectBehaviorSubject可以用來獲取以前的消息也是如此。

+0

非常感謝!它適用於:'messages.push(newMessage); thread.messages = Observable.of(thread.arrayMessages);' – Floriane