【问题标题】:Dificulties to display my firebase data in Angular with ordeyByChild使用 orderByChild 难以在 Angular 中显示我的 firebase 数据
【发布时间】:2020-10-08 07:47:36
【问题描述】:

我有一个这样组织的用户数据库:

Database
 - Users
  - Id (determined thanks to the push method)
    - email
    - firstName
    - ptsTotal
    - ...

我想使用 orderByChild 方法根据 ptsTotal(游戏中的点数)建立我的用户排名。

下面是我在 Angular 中的组件:

import { Component, OnInit } from '@angular/core';
import {UsersService} from '../../services/users.service';
import {User} from '../../models/user.model';
import * as firebase from 'firebase';

@Component({
  selector: 'app-total',
  templateUrl: './total.component.html',
  styleUrls: ['./total.component.scss']
})
export class TotalComponent implements OnInit {

  usersRanking:User[] = [];

  constructor(private usersService: UsersService) { }

  ngOnInit(): void {
    this.getRanking();
    //1
    console.log(this.usersRanking);
  }

  getRanking(){
    firebase.database().ref('/users').orderByChild('ptsTotal')
    .on('child_added',(data)=>{
          this.usersRanking = data.val() ? data.val() : [];
          //2
          console.log(this.usersRanking);
      });
  }
}

第一个奇怪的事情。结果与我询问用户列表时的形状不同(没有 orderByChild)。返回结果在 4 中是分开的(因为我有 4 个用户)与用户列表一样,我的所有用户只有 1 个对象。

这是获取我的用户列表的功能。我使用 users:User[] 和 emitUsers() 是用 rxjs 做一个 Observable。

  getUsers(){
    firebase.database().ref('/users')
    .on('value',(data)=>{
      this.users = data.val() ? data.val() : [];
      this.emitUsers();
    });
  }

第二个奇怪的事情。我的第二个 console.log() 显示 4 个结果与第一个 console.log() 一样(ngOnInit 中的一个只显示一个结果(我的用户得分最多)。

第三个奇怪的事情。我的 HTML 不工作。我使用 ngFor,页面上的结果是 6 行(我只有 4 个用户)。当我使用相同的方法仅显示我的用户(无顺序)时,此 Html 正在工作

名字:-姓氏:-点数:

名字:-姓氏:-点数:

名字:-姓氏:-点数:

名字:-姓氏:-点数:

名字:-姓氏:-点数:

名字:-姓氏:-点数:

(下面的HTML代码)

<div class="row">
  <div class="col-xs-12">
    <h2>Users Ranking</h2>
    <div class="list-group"
        *ngFor="let user of usersRanking | keyvalue async">
        <p>firstName : {{user.value.firstName}} - LastName : {{user.value.lastName}} - Number of Points : {{user.value.ptsTotal}}</p>
    </div>
  </div>
</div>

提前感谢您的帮助!

【问题讨论】:

  • 请在每个帖子中限制自己一个问题。对于您在这里的第一个问题:您能否编辑您的问题以显示您所描述的两种情况的代码,以便我们可以比较它们?如果您可以显示两种情况的输出,那也很棒,最好使用 console.log 语句,这样我们就不必考虑 Angular 方面了。
  • 对不起,弗兰克,如果我做错了。对我来说,这些问题是相互关联的,有助于理解我的问题。也就是说,我不明白如何使用 orderByChild 方法处理我的 firebase 输出。
  • 在一个帖子中发布多个问题,使得某人不可能/将回答所有问题(正如我只询问您的第一个问题的事实已经证明的那样),并且更有可能您的由于过于宽泛,帖子将被关闭。我会看看你更新的代码/输出。

标签: javascript angular firebase firebase-realtime-database


【解决方案1】:

如果我理解正确,您的第一个问题是由您使用的侦听器类型不同引起的。

第一个:

firebase.database().ref('/users').orderByChild('ptsTotal')
.on('child_added',(data)=>{
      this.usersRanking = data.val() ? data.val() : [];
      console.log(this.usersRanking);
  });

您在此处观察child_added,这意味着您的回调会针对与查询匹配的每个单独子节点(最初针对每个子节点,然后每次添加子节点时)调用。

你的第二个听众是:

firebase.database().ref('/users')
.on('value',(data)=>{
  this.users = data.val() ? data.val() : [];
  this.emitUsers();
});

您在这里侦听value 事件,这意味着您的代码会被调用并使用所有结果的一个快照(最初一次,然后每个结果都有变化)。

因此,每种格式看起来都不同是有道理的,因为您会获得不同级别的结果。如果你想在 value 监听器中看到相同类型的数据,你可以这样做:

firebase.database().ref('/users')
.on('value',(data)=>{
  data.forEach((snapshot) => {
    console.log(snapshot.val());
  })
});

在此处使用data.forEach() 也是确保您按照请求顺序查看值的关键。没有那个 data.val() 实际上会处于未定义的顺序,因为 JSON 中的字段没有定义的顺序。

【讨论】:

  • 谢谢弗兰克,问题是我无法在我的应用程序中显示带有 child_added 或 data.forEach 值的数据。我不想更改我的功能来检索我的用户。我的主要目标是建立一个排名,我只想能够根据 ptsTotal 检索和显示我的数据。这就是为什么我解释了我的全部问题并将这 3 个奇怪的事情放在一起,因为它们是相互关联的。可能是我的错误是第一个奇怪的事情,可能是第二个,或者第三个谁知道:)(人们可能知道但我不知道哈哈)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-23
  • 1970-01-01
  • 2020-04-30
  • 2020-03-06
相关资源
最近更新 更多