Использование combineLatest
- отличный способ. Поскольку user_uid не существует для пользователя, я добавил idField пользователю как user_uid. Сначала просмотрите код, а затем прочтите ниже для объяснения.
import { Component, OnInit } from '@angular/core';
import { AngularFirestore } from '@angular/fire/firestore';
import { Observable, combineLatest } from 'rxjs';
interface User {
name: string;
user_uid: string;
}
interface Artist {
style: string;
user_uid: string;
}
interface Joined {
user_uid: string;
name: string;
style: string;
}
@Component({
selector: 'test',
templateUrl: './test.component.html',
styleUrls: ['./test.component.scss']
})
export class TestComponent implements OnInit {
users$: Observable<User[]>;
artists$: Observable<Artist[]>;
joined$: Observable<Joined[]>;
constructor(private afs: AngularFirestore){}
ngOnInit(){
this.users$ = this.afs.collection<User>('users').valueChanges({idField: 'user_uid'});
this.artists$ = this.afs.collection<Artist>('artists').valueChanges();
this.joined$ = combineLatest(this.users$, this.artists$, (users, artists) => {
const joinedAsMap: Map<string, Joined> = new Map(artists.map(oneArtist => [oneArtist.user_uid, { ...{name: null} , ...oneArtist}]));
users.forEach(one => joinedAsMap.set(one.user_uid , {...{name: one.name}, ...joinedAsMap.get(one.user_uid) } ));
const joined: Joined[] = Array.from(joinedAsMap.values());
return joined;
});
}
}
- Сделать объединенный интерфейс
- Получить обе наблюдаемые
- использовать последнюю комбинацию
- Создайте карту с uid в качестве ключа и исполнителем в качестве значения. Задайте для имени значение null, чтобы типы работали. Используйте оператор распространения, чтобы объединить некоторые объекты.
- L oop через пользователя и добавить информацию о пользователе к значению каждого ключа
- Создать объединенный массив из значений карты
- вернуть значение
Вы можете сделать это по-разному, но использование карт es6 - хороший способ упростить некоторые вещи. Кроме того, не было возможности протестировать с реальной базой данных, поэтому вам может потребоваться проверка. Кроме того, все это находится внутри компонента для демонстрации. В сервисе это точно можно было бы сделать.