[英]How to only subscribe to firebase collection changes
我在 angular 应用程序中通过@angular/fire
使用 firebase javascript sdk。
使用 angularfire Collection#stateChanges()
,我以为我只是订阅了集合的状态更改(基于描述)。 即在初始订阅时不会返回任何内容。 但是,我发现 stateChanges() 立即返回集合中的所有内容,然后继续返回状态更改。
有没有办法只订阅未来的状态更改而不是“重播”过去的更改(直接使用firebase-js-sdk
或通过@angular/fire
)?
例如,如果您已经下载了一个集合的当前状态的副本,那么在简单地订阅集合更新时,您不希望重新下载集合状态。
谢谢你的帮助!
目前,firebase 不支持仅订阅查询更改。 当您订阅查询时,您还必须立即下载所有相关文档(请参阅 firebase-js-sdk 存储库中的问题#1551 )。
话虽如此,正如该问题中所指出的,您可以通过向文档添加updatedAt
属性并查询updatedAt > now
所有文档来伪造此功能。 这将使您订阅未来的更改。
这项工作的一个限制是 Firestore 仅支持在查询中的单个字段上使用不等式过滤器( >=
、 <
等),因此在updatedAt
字段上使用不等式过滤器可能会出现问题。
您可能正在寻找的是集合上的stateChanges方法。 从文档:
你为什么要使用它? - 上述方法返回按查询顺序排序的同步数组。 stateChanges() 在发生更改时发出更改,而不是同步查询顺序。 这适用于 ngrx 集成,因为您可以在您的 reducer 方法中构建您自己的数据结构。
以及使用@angular/fire
的代码示例:
this.angularFirestore
.collection('my-collection')
.stateChanges(['added', 'removed', updated']) // double check the state change references, these were assumed
.pipe(...);
以下方法是我用于类似案例的方法。 我有用户、组和组中用户的请求。
登录时,我获得了所需的数据(所有数据一目了然)。
但是对于已登录的用户,我需要订阅该组请求的任何插入、删除或编辑(不仅是更新时间...)。
所以我创建了一个更改请求的集合。 (groupRequestsChanged)
我已订阅
collection('groupRequestsChanged').doc(group-id-here...).valueChanged().subscribe()
这种方法在某些情况下很有帮助。
我参加这个聚会迟到了,但我通过首先获取我想要显示的尽可能多的文档(分页)来处理这个问题,然后使用stateChanges
订阅更改。 所以首先我做类似的事情
public displayedMessages: Array<any>;
this.db.collection('messages').ref.limitToLast(100).get().then(result => {
// display the result,
this.displayedMessages = result;
//then watch changes:
this.db.collection('messages').stateChanges().pipe(
skip(1),
map(changes => {
changes.forEach(itemDoc => {
if (itemDoc.type == 'added') {
this.displayedMessages.push(item);
} else if (itemDoc.type == 'modified') {
// find the message in displayedMessages and update the data
} else if (itemDoc.type == 'removed') {
// find the index and splice it.
}
})
})
)
})
这里的关键是来自 rxjs 的skip(1)
。 它跳过第一个发出的值,即整个集合。 你刚刚通过get
获得了全部信息,所以你不需要stateChanges
的第一次发射。 所以现在每次更改该集合时,您只会获得更改。 🚀
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.