Firebase列表是否可以反转?

5

我已经阅读了有关此问题的SO上的每个问题,但仍未找到答案。所以不要将其标记为重复。

我正在使用Angular 2和Typescript与AngularFire一起使用。 我正在使用FirebaseListObservable从一个端点提取24条最新记录的列表。 这是我的代码:

import { Component } from '@angular/core';
import { AngularFire, FirebaseListObservable } from 'angularfire2';

@Component({
  selector: 'story-list',
  templateUrl: './story-list.component.html',
  styleUrls: ['./story-list.component.scss']
})
export class StoryListComponent {
  stories: FirebaseListObservable<any[]>;

  constructor(af: AngularFire) {
    this.stories = af.database.list('/stories', {
      query: {
        limitToLast: 24
      }
    });
  }
}

这将返回最新的24个故事列表,正如预期的那样,但当我使用以下代码在页面上呈现它们时:

<p *ngFor="let story of stories | async">{{ story.title }}</p>

它将最古老的故事显示在顶部,最新的故事显示在底部。我理解为什么会这样,并不认为这是一个问题,但我如何才能将其反转?我希望能够在查询中反转它,但如果不可能,我也可以考虑在渲染中反转它。
无论您的答案是什么,请不要只提供文档链接。AngularFire没有完全解释这一点的文档。我已经读过每个字。请提供真正可行的代码。
然而,我绝对不会接受一种解决方案,即在记录创建时存储负日期,然后根据此进行排序。那是我听过的最糟糕的解决方案,一个真正的数据库系统应该允许您在查询中执行此操作。所以请不要建议这样做。
如果您有任何想法,我将非常感激。我不想因为我喜欢Firebase而不得不使用其他产品。
1个回答

18
据我所知,Firebase查询结果总是按升序排列。
但是,您可以使用map操作符将AngularFire2可观察到的数组反转,以便颠倒呈现列表的顺序。
import "rxjs/add/operator/map";

...

this.stories = af.database.list('/stories', {
  query: {
    limitToLast: 24
  }
}).map((array) => array.reverse()) as FirebaseListObservable<any[]>;

如果您更喜欢在模板中完成,您可以查看此回答


我喜欢第一种方法,但它会导致一个错误:“在类型'FirebaseListObservable <any []>'上不存在属性'map'”。 - Kyle Morgan
我认为问题在于FirebaseListObservable不是一个数组,因此您无法对其执行类似数组的操作。 - Kyle Morgan
它会工作的,发出的值是一个数组。这只是一个TypeScript/RxJS的问题。你可能需要导入map操作符来平息TypeScript。我已经更新了答案。 - cartant
我仍然会收到这个错误:“类型“FirebaseListObservable<any[]>”上不存在属性“map”。” 我已经导入了“rxjs/add/operator/map”。 - alltej
我的导入import { AngularFireDatabase,FirebaseListObservable } from 'angularfire2/database' import { AngularFireAuth } from 'angularfire2/auth' import { Observable } from 'rxjs/Observable' import * as firebase from 'firebase/app' - bresleveloper
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接