如何将Subject变量转换为Observable变量

时间:2017-08-18 10:39:34

标签: angular typescript rxjs

让我解释一下。这是我的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;
});

我绝望,你知道我的错误在哪里吗?为什么我可以查看最后一条消息,而不是所有消息?

1 个答案:

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

或许更好的方法是查看ReplaySubjectBehaviorSubject,也可以用来获取以前的消息。