Простой переподготовка. Используйте BehaviourSubject, если вы хотите получить некоторые начальные / текущие значения при подписке (вручную в службах / канале и т. Д., Или через асинхронный канал в HTML-шаблонах. Вот базовое предложение того, чего вы пытаетесь достичь. Конечно, есть гораздо больше должно быть сделано с учетом производства. С уважением.
chat.service.ts:
BackEndDB : ChatMessage[] = <Obtain data for chatHistory from your DB>();
Если вы используете какое-либо хранилище BackEnd для своей истории чата, инициализируйте BackEndDB через этот источник, если не let messages$
, то будет new BehaviorSubject<ChatMessage[]>(null);
. Это не сохранит вашу историю чата, если вы перезагрузите страницу.
messages$ = new BehaviorSubject<ChatMessage[]> // (this.BackEndDB OR null);
sendMessage(message: ChatMessage): void {
this.BackEndDB.push(message);
this.messages$.next(this.BackEndDB);
}
getMessages(): Observable<ChatMessage[]> {
return this.messages$.asObservable();
}
и затем в вашем компоненте:
import {ChatService} from 'yourPath/chat.service';
@Component({
selector: 'app-chat',
templateUrl: ['./chat.component.html'],
styleUrls: ['./chat.component.css'],
})
export class ChatComponent {
inbox$: Observable<ChatMessage[]>;
constructor(private chatService: ChatService) {
this.inbox$ = this.chatService.getMessages();
}
sendMessage(username, msg) {
let message: ChatMessage = {
msg: msg,
sender: username
}
this.chatService.sendMessage(message);
}
}
, а затем chat.component.html:
<label> Your Name: </label>
<input type="text" #userName>
<label> Your Message: </label>
<input type="text" #userMessage>
<button type="button" (click) = "sendMessage(userName.value,userMessage.value)">Send</button>
<div *ngIf="inbox$ | async; let messages ">
<div *ngFor= "let message of messages ">
<p> {{ message.sender }} </p>
<p> said: </p>
<p> {{ message.msg }} </p>
</div>
</div>
Вы можете создать интерфейс ChatMessage в общей папке, если вы собираетесь использовать его повторно, или непосредственно в своем компоненте, если он используется только там:
interface ChatMessage {
msg: string;
sender: string;
}
Единственная причина, по которой мы push
добавляем новые сообщения в переменную BackEndDB и затем вызываем следующую, заключается в том, что это простая демонстрация. В действительности вы должны использовать FirestoreCollectionDocument.valueChanges () или любую другую службу данных в реальном времени.