2016-08-24 23 views
3

我想要从Firebase实时数据库中获取所有用户,并按评分属性对其进行排序。我这有利用可变
users: FirebaseListObservable<any[]>;
工作,但我得到的错误:如何在Angularfire2 Angular2中对FirebaseListObservable列表进行排序?

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

我将不胜感激这个应该怎么做任何建议,以避免错误,或任何首选方法,谢谢!

回答

10

FirebaseListObservable implements lift,所以RxJS运营商 - 如map - 将返回一个FirebaseListObservable实例。

这只是 - 使用TypeScript时 - RxJS运算符是静态类型返回Observable,因此您必须投射到FirebaseListObservable。 (使用RxJS没有涉及打字稿,如果你看一下the guidance for adding operators你会看到,类型都没有提到。)

您可以验证FirebaseListObservable实例通过寻找你所提到的pushupdate函数返回你的问题:

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

+0

这是伟大的,和作品 - 非常感谢你:) –

+1

@LindsayWard这是在客户端完成。对于大量数据,您可能需要在服务器端进行排序。 Angularfire2支持'list()'中的第二个参数进行排序。 – Sam

+0

谢谢@Sam。很高兴知道。我也会尝试,看看我是否注意到有什么不同。 –

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

相关问题