Как я могу отсортировать список FirebaseListObservable в Angularfire2 Angular2?

Я хочу получить всех пользователей из базы данных 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[]>;
, ошибки исчезнут, но тогда я не смогу использовать методы Angularfire, такие как .push() и .update().

Мой код выборки и сортировки (который работает) выглядит так:

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

Я был бы признателен за любые советы о том, как это следует сделать, чтобы избежать ошибок, или любой предпочтительный способ, спасибо!


person Lindsay Ward    schedule 24.08.2016    source источник


Ответы (2)


FirebaseListObservable реализует lift< /a>, поэтому операторы RxJS, такие как map, будут возвращать экземпляр FirebaseListObservable.

Просто при использовании TypeScript операторы RxJS статически типизированы для возврата Observable, поэтому вам нужно привести к FirebaseListObservable. (При использовании RxJS не обязательно использовать TypeScript, и если вы посмотрите на руководство по добавлению операторов вы увидите, что типы не упоминаются.)

Вы можете убедиться, что экземпляр FirebaseListObservable возвращается, выполнив поиск функций push и 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 экземпляров, созданных как запросы. В отношении таких случаев существует вопрос без ответа.

person cartant    schedule 25.08.2016
comment
@LindsayWard Это делается на стороне клиента. Для большого набора данных может потребоваться сортировка на стороне сервера. Angularfire2 поддерживает второй параметр в list() для сортировки. - person Sam; 09.09.2016
comment
Спасибо @Сэм. Хорошо знать. Я тоже попробую и посмотрю, замечу ли я разницу. - person Lindsay Ward; 11.09.2016
comment
Я получаю следующую ошибку: [ts] Property 'map' does not exist on type 'FirebaseListObservable<any[]>'. Любые идеи, пожалуйста? Я использую: "angularfire2": "^2.0.0-beta.7-pre", и "firebase": "^3.6.4", Подробнее: stackoverflow.com/questions/41550132/ - person Richard; 09.01.2017
comment
@sam Я добавил sortBy в параметр запроса. как я могу указать сортировку - по убыванию или по возрастанию? - person alltej; 07.03.2017
comment
@Sam, могу ли я использовать любую функцию сортировки во втором параметре в list()? Можете ли вы увидеть этот вопрос stackoverflow.com/q/50112214/4299527? - person Setu Kumar Basak; 01.05.2018

Вам нужен этот пример. Чтобы просмотреть другие параметры, см. 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>;
}

person Александр Белов    schedule 07.04.2017
comment
Ошибка: 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' - person Dumbo; 26.12.2019