【问题标题】:Order async objects by date按日期排序异步对象
【发布时间】:2018-09-25 00:09:49
【问题描述】:

我有 Angular 5 + Firebase 应用程序,我从 Firebase 列表中获取项目并使用 *ngFor 将它们设置到视图中。

  <a routerLink="post/{{post.url}}" *ngFor="let post of (posts | async)">
     <h2>{{ post?.title }}</h2>
     <span>{{ post?.date }}</span>
  </a>

每个项目我都有一个格式为“dd.mm.yyyy”的“日期”字段。如何将它们设置为按日期(从最新到旧)排序的组件视图?

如何从 Firebase 获取帖子:

  getPosts(): Observable<any[]> {
    return this.db.list('posts').snapshotChanges().map(changes => {
      return changes.map(c => ({
        key: c.payload.key,
        ...c.payload.val() }));
    });
  }

【问题讨论】:

  • 您可能可以在获得posts 时对其进行排序。我们可以看看代码吗?
  • 正如@ConnorsFan所说,您可以从firebase查询并获取排序数据,如果没有,您还可以在订阅模板之前映射可观察对象并在服务中排序
  • @ConnorsFan 我在问题中添加代码
  • 我不知道 firebase 但你可以试试这个语法:this.db.list('posts', { query: { orderByChild: 'date' } }).map((arr) =&gt; { return arr.reverse(); }).snapshotChanges()...。可能有一种方法可以用orderByChild 指定“desc”;如果是这样,就不需要调用reverse()

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


【解决方案1】:

您的日期为"dd.mm.yyyy",这是一种天生难以排序的日期格式。使用这种格式,您必须在客户端上进行排序/过滤。

如果您以 ISO-8859 格式(例如 yyyy-mm-dd)存储日期,您可以让 Firebase 处理排序/过滤:

this.db.list('posts', ref => ref.orderByChild('date'))

另请参阅AngularFire2 documentation on queries

请注意,这只会按升序顺序对项目进行排序,即从最旧到最新。如果您希望它们下降,则必须在客户端中反转,或存储反转值。在后一种情况下,我建议存储倒置时间戳而不是字符串,例如

"negativeTimestamp": -1523753371440

有关此的更多信息,请参阅我对 firebase -> date order reverse 的回答中的链接

【讨论】:

    猜你喜欢
    • 2019-07-05
    • 2017-08-01
    • 2017-08-19
    • 1970-01-01
    • 1970-01-01
    • 2013-10-18
    • 2014-05-12
    • 1970-01-01
    相关资源
    最近更新 更多