Я пытаюсь получить коллекцию AngularFirestoreCollection из службы в angular. AngularFirestoreCollection инициализируется асинхронно внутри наблюдаемой подписки. Когда я пытаюсь получить коллекцию из компонента, я получаю сообщение об ошибке, потому что оно не определено.
Вот код моего сервиса:
fokosCollection: AngularFirestoreCollection<Foko>;
myFokos: Observable<Foko[]>;
constructor(auth: AuthService, public afs: AngularFirestore) {
this.myFokos = auth.user$.switchMap(user => {
if (user) {
this.fokosCollection = afs.collection<Foko>('users/' + user.uid + '/fokos');
return this.fokosCollection.valueChanges();
}
});
}
Это код моего компонента:
this.myListService.fokosCollection.doc(codeInput).valueChanges().take(1).subscribe(foko => {
getData(foko)
});
Я попытался создать Субъект, который уведомлял компонент при инициализации Коллекции. Это сработало, когда я перешел непосредственно к этому компоненту. Однако, если я перешел к этому компоненту из другого, тема подписки никогда не вызывалась (поскольку подписка не существовала, когда субъект отправлял коллекцию).
Вот что я попробовал:
fokosCollection: AngularFirestoreCollection<Foko>;
fokosCollectionSubject = new Subject<AngularFirestoreCollection<Foko>>();
myFokos: Observable<Foko[]>;
constructor(auth: AuthService, public afs: AngularFirestore) {
this.myFokos = auth.user$.switchMap(user => {
if (user) {
this.fokosCollection = afs.collection<Foko>('users/' + user.uid + '/fokos');
this.fokosCollectionSubject.next(this.fokosCollection);
...
И я изменил код компонента на этот:
this.myListService.fokosCollectionSubject.take(1).switchMap(fokosCollection => {
return fokosCollection.doc(codeInput).valueChanges().take(1);
}).subscribe(foko => {
getData(foko)
});
Я могу попытаться получить коллекцию, и если она выдаст ошибку, подпишитесь на тему. Тем не менее, я думаю, что это не будет хорошим кодом. Итак, что лучше всего использовать для асинхронных данных в Angular?