В моем приложении Ioni c 5 / Angular у меня есть следующие модели: Conversation
& Message
:
export class Conversation {
constructor(
public id: string,
public userId: string,
public mechanicId: string,
public messages: Message[]
) { }
}
export class Message {
constructor(
public id: string,
public text: string,
public userId: string,
public timestamp: Date
) { }
}
На странице Conversation-Detail
отображается список Messages
относится к определенному Conversation
.
На Conversation-Detail
также существует форма, позволяющая пользователям добавлять больше Message
s к этому Conversation
.
Здесь текущее поведение:
- Открыть
Conversation-Detail
страницу, и отображается список Message
s - Введите текст в форму и нажмите кнопку Отправить. Не обновляется список
Message
с. - Покинуть страницу
Conversation-Detail
, вернуться к Conversation-Detail
, и список Message
с содержит новое сообщение.
Но я хочу, чтобы список Message
обновлялся после того, как пользователь нажимает Отправить, как мне это сделать? (т. Е. Отображать последние сообщения)
Я думаю, важно отметить, что console.log('Loaded', this.loadedMessages);
отображается только при переходе на страницу, но не регистрируется при отправке новый Message
Вкл. Conversation-Detail
, я использую идентификатор Conversation
для отображения всех Message
с в этом Conversation
:
<ion-virtual-scroll [items]="loadedMessages">
<ion-item-sliding *virtualItem="let message">
<h2>{{ message.text}}</h2>
</ion-item-sliding>
</ion-virtual-scroll>
Conversation-detail.page.ts:
conversation: Conversation;
loadedMessages: Message[];
private conversationsSub: Subscription;
ngOnInit() {
this.conversationsSub = this.conversationsService
.getConversation(paramMap.get('conversationId'))
.subscribe(conversation => {
this.conversation = conversation;
this.loadedMessages = this.conversation.messages;
console.log('Loaded', this.loadedMessages);
this.form = new FormGroup({
message: new FormControl(null, {
})
});
});
});
}
Conversations.service.ts:
getConversation(id: string) {
return this.conversations.pipe(
take(1),
map(conversations => {
return { ...conversations.find(conversation => conversation.id === id) };
}));
}
На Conversation-Detail
, у меня также есть форма, позволяющая пользователям добавлять больше Message
s к этому Conversation
:
<form [formGroup]="form">
<ion-textarea formControlName="message"></ion-textarea>
<ion-button (click)="onSendMessage()">Send</ion-button>
</form>
Conversation-detail.page.ts:
onSendMessage() {
this.conversationsService.addMessageToConversation(this.conversation.id, this.form.value.message);
}
И здесь это остальная часть ConversationsService
кода:
addMessageToConversation(conversationId: string, message: string) {
this.getConversationToAddMessage(conversationId).messages.push(this.createMessage(message));
console.log(this._conversations);
}
getConversationToAddMessage(id: string) {
return this._conversations.getValue().find(conversation => conversation.id === id);
}
private createMessage(message: string): Message {
return {
id: Math.random().toString(),
text: message,
userId: this.authService.userId,
timestamp: new Date(Date.now())
};
}
Так что список Message
обновляется только когда я покидаю страницу и go возвращаюсь. Как я могу обновить список, не выходя?