如何在Angularfire2 Angular2中对FirebaseListObservable列表进行排序?

时间:2016-08-24 21:21:22

标签: angular typescript firebase firebase-realtime-database angularfire2

我希望从Firebase实时数据库中获取所有用户,并按分数属性对其进行排序。我已经使用变量
工作了 users: FirebaseListObservable<any[]>;
但是我得到了错误:

Type 'Observable<any[]>' is not assignable to type 'FirebaseListObservable<any[]>'.
Property '_ref' is missing in type 'Observable<any[]>'.

如果我将变量更改为
users: Observable<any[]>;
那么错误消失了,但我不能使用像.push().update()这样的Angularfire方法。

我的提取和排序代码(有效)如下:

this.users = this.af.database.list('/users')
  .map(items => items.sort((a, b) => b.score - a.score));

如果有任何建议可以避免错误或任何首选方式,我将不胜感激,谢谢!

2 个答案:

答案 0 :(得分:11)

FirebaseListObservable实现lift,因此RxJS运算符(如map)将返回FirebaseListObservable个实例。

就是这样 - 当使用TypeScript时 - RxJS运算符被静态类型化以返回Observable,因此您必须转换为FirebaseListObservable。 (使用RxJS不必涉及TypeScript,如果查看the guidance for adding operators,您将看到未提及类型。)

您可以通过查找问题中提到的FirebaseListObservablepush函数来验证是否返回了update个实例:

this.users = this.af.database
  .list('/users')
  .map(items => items.sort((a, b) => b.score - a.score)) as FirebaseListObservable<any[]>;
console.log(this.users.push.toString());
console.log(this.users.update.toString());

但请注意,这对于作为查询创建的FirebaseListObservable个实例不起作用。关于此类情况有as-yet-unanswered question

答案 1 :(得分:2)

你需要这个例子。要观看其他选项,请参阅Query界面。

&#13;
&#13;
this.items = angularFire.database.list('/users', {
  query: {
    orderByChild: 'childPropertyName'
  }
});
&#13;
&#13;
&#13;

&#13;
&#13;
export interface Query {
    [key: string]: any;
    orderByKey?: boolean | Observable<boolean>;
    orderByPriority?: boolean | Observable<boolean>;
    orderByChild?: string | Observable<string>;
    orderByValue?: boolean | Observable<boolean>;
    equalTo?: any | Observable<any>;
    startAt?: any | Observable<any>;
    endAt?: any | Observable<any>;
    limitToFirst?: number | Observable<number>;
    limitToLast?: number | Observable<number>;
}
&#13;
&#13;
&#13;