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

时间:2019-03-11 00:38:59

标签: firebase rxjs google-cloud-firestore observable

背景

大多数通过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);
            });
        });
    }

问题

但是,作为该领域的新手,我的解决方案让人感到困惑,我正在寻找最佳方法。谢谢您的时间!

1 个答案:

答案 0 :(得分: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)