【问题标题】:Firebase Angular - Sort my user by value - sort is not a functionFirebase Angular - 按值对我的用户进行排序 - 排序不是函数
【发布时间】:2020-06-12 04:16:01
【问题描述】:

我正在使用 firebase 和 Angular,这是我的用户数据库:

我想按“ptsTotal”对我的用户进行排序。

我有一个带有函数 getUsersByPoints 的 users.service。但是当我使用它时,控制台会返回给我: this.users.sort 不是函数。

我看不出我在哪里做错了。你能帮我找出错误或给我另一个解决方案来对我的用户进行排序吗?

非常感谢,

import { Injectable } from '@angular/core';
import {User} from '../models/user.model';
import {Subject} from 'rxjs/Subject';
import * as firebase from 'firebase';

@Injectable({
  providedIn: 'root'
})
export class UsersService {

  users: User[] = [];
  usersSubject = new Subject<User[]>();

  constructor() { }

  emitUsers(){
    this.usersSubject.next(this.users);
  }

  saveUsers(){
    firebase.database().ref('/users').set(this.users);
  }

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

【问题讨论】:

  • 看起来firebase正在将this.users变成一个对象,所以它的原型将不再包含排序。

标签: javascript angular firebase firebase-realtime-database


【解决方案1】:

data.val() 不会是一个数组。这将是一个对象,其属性的名称与用户下的子键相同(例如“-M9YJ ...”)。这些属性将进一步包含每个子项下的数据。

如果您需要按子值排序,Realtime Database 实际上可以使用orderByChild() 为您执行此操作,如documentation 中所述。您无需在客户端中进行排序。

如果您仍想在客户端中排序,则必须以某种方式 convert that object to an array,然后将排序应用于该新数组。

【讨论】:

  • 你好@Doug。谢谢,我几乎可以肯定 orderByChild 是使用的好方法。但似乎我的 id "M9YJ..." 是个问题。当我在做 orderByChild('ptsTotal') 时,它不起作用。就像我希望所有用户建立一个排名一样,我不能做 orderByChild('Id/ptsTotal')。解决办法是什么?
猜你喜欢
  • 2018-01-13
  • 1970-01-01
  • 2023-04-07
  • 2021-03-28
  • 1970-01-01
  • 2018-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多