代码之家  ›  专栏  ›  技术社区  ›  pulkitsinghal

如何从firebase的firestore访问不可观测的数据集?

  •  1
  • pulkitsinghal  · 技术社区  · 6 年前

    背景

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

    问题

    但作为这个领域的新手,我的解决方案让人觉得做作,我在寻找如何做到最好的方法。谢谢你抽出时间!

    0 回复  |  直到 6 年前
        1
  •  1
  •   Fan Cheung    6 年前

    应该使用异步管道而不是设置实例属性,因为异步管道处理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)