Firebase onSnapshot仅返回更改的项目

时间:2020-09-13 20:24:24

标签: javascript firebase google-cloud-firestore

这是我关于stackoverflow的第一篇文章,并且我正在寻求一些帮助,因为我已经为此花了一段时间了。

我目前正在使用Firebase开发Web应用程序,并且正在使用onSnapshot方法。目前,我正在从数据库中返回用户列表 UI。 以下是我填充UI的函数。

db.collectionGroup('items').where("userid", "==", user.id).orderBy('date', "desc").limit(80).onSnapshot(snapshot => {

 snapshot.docChanges().forEach(change => {
    if (change.type === 'added') {
       setupLedger(snapshot.docs, doc.id)
    }    
    if (change.type === 'modified') {
       setupLedger(snapshot.docs, doc.id)
    } 
    if (change.type === 'removed') {
       deleteLedger(user, doc.id);
    }
 });
});

在页面加载时,我会用type: "added"获取所有必要的数据 (see this

当我单击EDIT(即修改)时,会发生我的问题,它仅返回修改后的条目并更新修改后的条目(see this)。但是,如果我在另一个字段上单击EDIT,它将显示上一个条目,而不是当前条目(see this)。我将如何更改我的方法,以便获得所有条目,包括修改后的条目?本质上,我只想更新当前项,一旦更新,我想返回数组(包含修改后的项)。

(旁注:如果刷新页面,则返回包含修改后的项目的数组,并且一切正常。)

1 个答案:

答案 0 :(得分:1)

受查询影响的所有文档(无论是否已修改)都可以通过snapshot.docs访问,而有关已更改文档的其他信息则可以通过snapshot.docChanges()访问。因此,请考虑将您的代码更改为以下内容:

db.collectionGroup('items').where("userid", "==", user.id).orderBy('date', "desc").limit(80).onSnapshot(snapshot => {

  snapshot.docs.forEach(doc => {
    ...
  }
}