微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript – Firestore:如何重新订购我已经引用的集合?

有没有办法保持相同集合的引用,但使用firestore更改顺序?

TLDR:这就像我想要实现的功能
https://stackoverflow.com/a/17320018,
但由于我的数据来自firestore,我还没有找到动态完成此操作的正确方法.

假设我有一个messagesService.ts,其中包含一组消息和对Observable消息的引用:

messagesCollection: AngularFirestoreCollection<Message>
messages: Observable<Message[]>;

this.messagesCollection = this.db.collection('messages', ref => {
  return ref.orderBy('dateCreated', 'desc');
});

this.messages= this.messagesCollection.valueChanges();

当我将此数据弹出到* ngFor =“let message of message | async”时,它会按预期在顶部显示最新消息.

我需要帮助的地方:

我希望能够单击一个按钮并更改消息的顺序(或者我从firestore获取的数据的顺序).例如,您可以单击按钮以按最喜欢,最高视图或最旧消息,按字母顺序排列等消息进行排序.我是否需要为每个我想要对同一集合进行排序的方式单独引用?这看起来很草率,有没有更清晰的方式动态地做到这一点?

最初,我尝试过这样的事情:

sortMessagesBy(field) {
    this.messagesCollection = this.db.collection('messages', ref => {
          return ref.orderBy(field, 'desc');
    });
}

但是,这不起作用,因为它似乎更改了对集合的引用,因此可观察的消息未更新.

接下来,我尝试了这个:

sortMessagesBy(field) {
    this.messagesCollection = this.db.collection('messages', ref => {
          return ref.orderBy(field, 'desc');
    });
    this.messages= this.messagesCollection.valueChanges();
    return this.messages;
}

但这似乎创建了一个新的this.messages对象,它使ngFor重新渲染整个页面并且看起来非常草率(即使使用trackBy).

最后,我想进一步缩小范围,在同一个集合中,我甚至可以使用where子句来定位特定的消息子集,并且能够应用相同的动态排序,I.E.:

this.messagesCollection = this.db.collection('messages', ref => {
      return ref.where("type", "==", "todo").orderBy(field, 'desc');
});

我只是不知道如何在不弄清楚如何动态地做到这一点的情况下做到这一点.

解决方法:

据我所知,AngularFirestoreCollection class是不可改变的.这意味着您无法在构建之后对其进行更改.

这与Firebase SDK类一致.这段代码

ref.where("type", "==", "todo").orderBy(field, 'desc')

创建一个Query object,它也是不可变的.要更改结果的顺序,您必须创建一个查询一个新的AngularFirestoreCollection.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐