如何从Firebase的Firestore访问不可观察的数据集?



背景

大多数通过Angularfire从Firebase Firestore获取数据的示例:

(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);
            });
        });
    }

问题

但是,作为这个特定领域的新来者,我的解决方案感到人为人为,我正在寻找最好的方法。谢谢您的宝贵时间!

您应该使用异步管而不是设置实例属性,因为async管道在ondestory时处理了unsubscripion。但是,如果您确实想将结果分配给属性,则只需将其分配在subsibr()

 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)  

最新更新