【发布时间】:2018-09-06 14:24:36
【问题描述】:
有没有办法保留同一个集合的引用,但使用 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 messages | 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 子句来定位特定的消息子集并能够应用相同的动态排序IE:
this.messagesCollection = this.db.collection('messages', ref => {
return ref.where("type", "==", "todo").orderBy(field, 'desc');
});
如果不弄清楚如何动态地做到这一点,我只是不明白如何做到这一点。
【问题讨论】:
标签: javascript angular firebase google-cloud-firestore angularfire2