让我解释一下。这是我的HTML显示我的消息:
<message
*ngFor="let message of thread.messages | async"
[message]="message">
</message>
我的 thread.messages 变量是一个Observable。
export class Thread {
id: string;
messages: Observable<Message[]> = new Observable<Message[]>();
}
在我的 addNewMessage()函数中,我创建了一个Subject变量来添加新消息:
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 :(得分: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
,也可以用来获取以前的消息。