如何格式化和显示从AngularFire返回的Firestore数据?

时间:2019-11-22 19:03:59

标签: angular ionic-framework google-cloud-firestore rxjs angularfire2

我有一个简单的团队列表,首先我将每个团队放在一个firebase文档中,当查询集合时,很容易用*ngFor用HTML显示它们。很简单的例子:

<ion-card *ngFor="let t of (team|async)" >
  <ion-card-header>
    <ion-card-title>name: {{t.name}} </ion-card-title>
      {{t.pic}}
      score = {{t.score}}
  </ion-card-header>
</ion-card>

然后,我决定使用地图类型(json对象)测试将所有团队放在一个Firebase文档中。但是现在*ngFor无法正常工作。 (我明白了为什么的本质,但无法解决):

这是数据库文档:

enter image description here

说这是新查询:

this.teams= this._db.collection('teams').doc("allteams").valueChanges();

然后我尝试将响应设置为数组:(因为否则*ngFor会显示错误)

this.team= this.teams.pipe(map((res: Response) => {return [res]}));

,这样做之后,在HTML中,例如,我只能访问一个值:

<ion-card *ngFor="let t of (team|async)" >
  <ion-card-header>
    <ion-card-title>name: {{t.team1.name}} </ion-card-title>
  </ion-card-header>
</ion-card>

但是我真的无法像以前那样展示:

<ion-card *ngFor="let t of (team|async)" >
  <ion-card-header>
    <ion-card-title>name: {{t.name}} </ion-card-title>
      {{t.pic}}
      score = {{t.score}}
  </ion-card-header>
</ion-card>

我了解到响应只是一个数组,但无法将其转换为有效的数组。

我也尝试过类似的事情:

this.team= this.teams.pipe(map((res: Response)=> {for(let r in res){return r}}));

,但这只会console.log:team1, team2, team3。其他所有数据都不在那里。

衷心感谢您的帮助! :)

1 个答案:

答案 0 :(得分:2)

您的上一次尝试非常接近,但是在这种情况下,您实际上只返回了密钥(这是您观察到的行为)。

由于当您在文档上调用valueChanges时AngularFire仅返回原始文档值,因此您可以像直接处理对象一样对其进行操作。由于要返回给定键的值,因此只需要将其从对象中拉出即可。

尝试一下:

this.team = this.teams.pipe(map(res => {
  return Object.keys(res).map(x => res[x]);
}));

此代码映射对象上的所有键,并返回这些键的所有值的数组。 Angular / Ionic模板应该能够按照您期望的方式处理。

旁注:我已切换到Object.keys,因为tslint喜欢将throw an error用于未过滤的for x in obj

我也不太清楚这里的Response是什么,因此为了清楚起见,我省略了该类型-该代码实际上并不是类型相关的。

上面的代码当然不会保留密钥。如果要这样做,可以:

this.team = this.teams.pipe(map(res => {
  return Object.keys(res).map(x => {
    const output = res[x];
    output._key = x;
    return output;
  });
}));

请确保您使用的属性(在这种情况下为_key)在您的对象上不存在,否则将被覆盖:)