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

Posted

技术标签:

【中文标题】如何在 Angularfire2 Angular2 中对 FirebaseListObservable 列表进行排序?【英文标题】:How can I sort a FirebaseListObservable list in Angularfire2 Angular2? 【发布时间】:2017-01-01 04:10:15 【问题描述】:

我想从 Firebase 实时数据库中获取所有用户并按分数属性对他们进行排序。我可以使用变量users: FirebaseListObservable<any[]>; 但我得到了错误:

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

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

我的获取和排序代码(有效)如下所示:

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

对于如何避免错误或任何首选方式的任何建议,我将不胜感激,谢谢!

【问题讨论】:

【参考方案1】:

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

只是 - 在使用 TypeScript 时 - RxJS 运算符是静态类型化的以返回 Observable,因此您必须强制转换为 FirebaseListObservable。 (使用 RxJS 不必涉及 TypeScript,如果您查看 the guidance for adding operators,您会发现没有提及类型。)

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

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。

【讨论】:

@LindsayWard 这是在客户端完成的。对于大量数据,您可能希望在服务器端进行排序。 Angularfire2 支持list() 中的第二个参数进行排序。 谢谢@Sam。很高兴知道。我也会尝试一下,看看是否有任何不同。 我收到以下错误:[ts] Property 'map' does not exist on type 'FirebaseListObservable&lt;any[]&gt;'. 有什么想法吗?我正在使用:"angularfire2": "^2.0.0-beta.7-pre","firebase": "^3.6.4", 更多详细信息:***.com/questions/41550132/… @sam 我在查询参数中添加了 sortBy。如何指定排序 - desc 或 asc? @Sam,我可以在 list() 的第二个参数中使用任何排序函数吗?你能看看这个问题***.com/q/50112214/4299527吗?【参考方案2】:

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

this.items = angularFire.database.list('/users', 
  query: 
    orderByChild: 'childPropertyName'
  
);

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>;

【讨论】:

错误:Argument of type ' query: orderByChild: string; ; ' is not assignable to parameter of type 'QueryFn'. Object literal may only specify known properties, and 'query' does not exist in type 'QueryFn'

以上是关于如何在 Angularfire2 Angular2 中对 FirebaseListObservable 列表进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Angular2、angularfire2 和 Typescript 从 Firebase 对象中获取数据

使用 AngularFire2 (Angular2 rc.5) 访问 firebase.storage()

使用 angularfire2 时如何访问本机 Firebase 对象?

如何在单元测试中模拟 AngularFire 2 服务?

Angularfire2:“location.protocol”必须是 http 或 https(一个 Meteor 应用程序)

canActivate 在订阅更改时不响应 Angular 2 路由器 AngularFire2