#firebase #rxjs #google-cloud-firestore #observable
#firebase #rxjs #google-облако-firestore #наблюдаемый
Вопрос:
Предыстория
Большинство примеров извлечения данных из FireStore Firebase через AngularFire:
(a) показать использование Observable<any[]>
для извлечения данных:
export class AppComponent {
items: Observable<any[]>;
constructor(db: AngularFirestore) {
this.items = db.collection('items').valueChanges();
}
}
(b) связать его с шаблоном, используя канал для async
:
<ul>
<li class="text" *ngFor="let item of items | async">
{{item.name}}
</li>
</ul>
Ситуация
Я не вижу примеров того, как просто извлекать, data: SomeModel[]
а НЕ data: Observable<SomeModel[]>
… после некоторых усилий я нашел обходной путь:
async getData(): Promise<SomeModel[]> {
return await new Promise((resolve, reject) => {
this.myCollection.snapshotChanges().subscribe(data => {
this.data = data.map(e => {
return {
id: e.payload.doc.id,
...e.payload.doc.data()
};
});
resolve(this.data);
});
});
}
Вопрос
Но как новичку в этой конкретной области, мое решение кажется надуманным, и я ищу, как сделать это наилучшим образом. Спасибо, что уделили нам время!
Ответ №1:
Вы должны использовать асинхронный канал вместо установки свойства экземпляра, потому что асинхронный канал обрабатывает отмену подписки при onDestory. но если вы действительно хотите присвоить результат свойству, вы просто назначаете его в subscribe ()
getModel():Observable<MyModel[]>{
this.myCollection.snapshotChanges().map((data) => {
return this.data = data.map(e => {
return {
id: e.payload.doc.id,
...e.payload.doc.data()
};
});
});
}
this.getModel().subscribe(data=>this.data=data)