Я подписываюсь на получение чатов пользователей, а затем для каждого чата я подписываюсь на две другие наблюдаемые.
get_user_chat(chat) {
let user = this.firebase.get_user_by_uid(chat.key).snapshotChanges();
let chatInfo = this.firebase.get_single_chat(chat.payload.val()).snapshotChanges();
return Observable.forkJoin(user.take(1), chatInfo.take(1));
}
getChats() {
//start loading
let loading = this.loadingCtrl.create();
loading.present();
//get chats
this.firebase.get_user_chats().snapshotChanges().takeUntil(this.ngUnsubscribe).subscribe(chats => {
chats.forEach(chat => {
this.get_user_chat(chat).takeUntil(this.ngUnsubscribe).subscribe(userChat => {
this.userChat = userChat;
this.user = this.userChat[0];
this.chat = this.userChat[1];
this.chats.push({
firstName: this.user.payload.val().firstName,
imageUrl: this.user.payload.val().imageUrl,
uid: this.user.key,
chatId: chat.payload.val(),
last_message: this.chat.payload.val().last_message.message,
type: this.chat.payload.val().last_message.type
})
})
})
//dimiss loading
loading.dismiss();
}, err => {
//dimiss loading
loading.dismiss();
})
}
Теперь для внешнего интерфейса я отображаюданные как это:
<ion-content>
<ion-list class="chat-list" *ngIf="(chats)?.length>0">
<a ion-item detail-none *ngFor="let c of chats" (click)="toChat(c.chatId, c.uid)">
<ion-thumbnail item-start>
<img-loader class="img-logo" src={{c.imageUrl}} fallbackUrl="assets/img/placeholder-person.png" useImg></img-loader>
</ion-thumbnail>
<h2>{{c.firstName}}</h2>
<h3 *ngIf="c.type!='img'">{{c.last_message}}</h3>
<img class="img-placeholder" *ngIf="c.type=='img'" src="assets/img/placeholder-image.png">
<!-- <ion-icon item-right name="ios-arrow-forward"></ion-icon> -->
</a>
</ion-list>
<ion-card *ngIf="(chats)?.length==0">
<ion-card-content>
You don't have any chats.
</ion-card-content>
</ion-card>
</ion-content>
Это работает, за исключением того, что последнее сообщение чата не будет автоматически обновляться во внешнем интерфейсе, я понимаю, почему это не работает, я толкаю наблюдателя в массив, который теряетфункция для прослушивания изменений, но я не мог понять, как я могу прослушивать изменения, не выдвигая объекты от двух разных подписчиков и правильно отображая их.По сути, мне приходится каждый раз перезагружать список чатов, чтобы увидеть изменения.
Это лучше объяснить картинками:
Последнее сообщение для Холли: «a»
Я отправляю еще одно сообщение Холли, последнее сообщение теперь должно быть 'B'
Но последнее сообщение не будет обновлятьсябез обновления страницы, он не слушает изменения, потому что я помещаю наблюдаемое в массив
Структура базы данных Firebase в реальном времени для чата 1: 1
Пользователь1:
Пользователь 2:
Чат: