如何从 Angular 中的集合中正确检索 FireStore 对象数组?

How can I correctly retrieve the array of FireStore objects from a collection in Angular?

在我的应用程序中,直到现在,我从模拟的对象数组(其中每个对象代表我的 table 的一行)中检索到必须显示到 table 中的数据。

最初我只是在我的组件 TypeScript 代码中加入了这样的东西:

orders: any[];

然后进入我的 ngOnInit() 方法,我完成了:

this.ordersService.getAllOrders().then(orders => {
    this.orders = orders;
    console.log("RETRIEVED ORDERS: ", orders);
    this.loading = false;
});

我的服务的 getAllOrders() 方法只是从 JSON 文件中检索数据(数组):

  getAllOrders() {
    return this.http.get<any>('assets/json_mock/ordini.json', {responseType: 'json'})
        .toPromise()
        .then(res => res.data)
        .then(data => { return data; });
  }

它工作正常。

现在我正尝试从 FireStore 数据库中检索这个对象数组,但我遇到了一些问题。

我这样做过

进入我的组件 class 的 ngOnInit() 现在我有:

   this.ordersService.getAllOrders().subscribe(ordersList => {
     console.log("RETRIEVED ordersList: ", ordersList);
     this.orders = ordersList;
     console.log("RETRIEVED ORDERS: ", this.orders);
     this.loading = false;
   });

然后进入服务class将getAllOrders()改成这样:

getAllOrders(): Observable<any[]> {
    this.ordersList = this.db.collection('Orders').snapshotChanges();

    return this.ordersList;
}

它部分起作用是因为它似乎从 FireStore 检索某些东西(连接工作正常)而且我认为也是我的“查询”。

问题是在我的组件的 subscribe() 方法中,这些行:

this.ordersService.getAllOrders().subscribe(ordersList => {
    console.log("RETRIEVED ordersList: ", ordersList);
    this.orders = ordersList;
    console.log("RETRIEVED ORDERS: ", this.orders);
    this.loading = false;
 });

它在 Chrome 控制台打印:

所以我认为我必须以某种方式从此对象中提取我的数组。我错过了什么?我该怎么做?

Firestore 不存储 JSON。它存储 key/value 对强类型值,正如官方 documentation:

中提到的那样

“使用 Map 或 Dictionary 对象来表示您的文档通常不是很方便,因此 Cloud Firestore 支持使用自定义 classes 编写文档。Cloud Firestore 会将对象转换为支持的数据类型。”

因此,没有直接的方法可以直接将结果作为json对象获取。

有一个名为 AngularFirestoreCollection 的服务,它是原生 Firestore SDK 的包装器,在此文档中,您可以找到有关如何从 firestore 获取数据的有用示例,例如:

import { Component } from '@angular/core';
import { AngularFirestore, AngularFirestoreCollection } from '@angular/fire/firestore';
import { Observable } from 'rxjs';

export interface Item { name: string; }

@Component({
  selector: 'app-root',
  template: `
    <ul>
      <li *ngFor="let item of items | async">
        {{ item.name }}
      </li>
    </ul>
  `
})
export class AppComponent {
  private itemsCollection: AngularFirestoreCollection<Item>;
  items: Observable<Item[]>;
  constructor(private afs: AngularFirestore) {
    this.itemsCollection = afs.collection<Item>('items');
    this.items = this.itemsCollection.valueChanges();
  }
  addItem(item: Item) {
    this.itemsCollection.add(item);
  }
}

另一方面,如果您想直接使用 QuerySnapshot class,请查看此