繁体   English   中英

如何仅订阅 Firebase 集合更改

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM