Firebase child_added只能获取到新增的子节点。

12 浏览
0 Comments

Firebase child_added只能获取到新增的子节点。

从Firebase API:

Child Added: 这个事件将为该位置的每个初始子项触发一次,并且每次添加新的子项时都会再次触发。

一些代码:

listRef.on('child_added', function(childSnapshot, prevChildName) {
    // 处理子项
});

但由于该函数被调用一次每个位置的每个子项,有没有办法只获取实际添加的子项呢?

0
0 Comments

Firebase的child_added事件用于监听在特定位置下的子节点添加事件。然而,在使用child_added事件时,有时会遇到只获取新添加的子节点的需求。下面将讨论这个问题出现的原因以及解决方法。

首先,我们需要了解一下Firebase中的push()方法。调用ref.push()方法时,如果不传入数据,则会根据当前时间生成一个路径键。在上面的代码示例中,我们获取了一个基本引用messagesRef,然后通过调用push()方法生成一个键startKey,这个键是根据当前时间生成的。接着,我们使用startAt()方法来获取从startKey开始的所有子节点。

这样做的原因是为了只获取新添加的子节点。通过将startKey传递给startAt()方法,我们可以告诉Firebase只返回从startKey之后添加的子节点。然后,我们使用child_added事件来监听这些新添加的子节点,并进行相应的处理。

需要注意的是,实际上并没有将任何数据写入到ref.push()方法返回的引用或键中,所以不需要捕获空数据。

因此,通过上述代码示例中的方法,我们可以实现只获取新添加的子节点的需求。

0
0 Comments

Firebase的child_added事件在添加新子节点时被触发。然而,有一个问题是它会在查询到达限制时停止触发该事件,并且不会触发新的子节点添加事件。为了解决这个问题,可以使用endAt()和limit()方法来获取最后一条记录,从而追踪从某个检查点之后添加的内容。

具体的解决方法如下所示:

// 从'ref'中检索最后一条记录
ref.endAt().limitToLast(1).on('child_added', function(snapshot) {
   // 最后一条记录之后的所有记录都会触发该函数
   console.log(snapshot.name(), snapshot.val());
});

然而,这个方法只适用于有序集合。如果你需要对其他内容进行排序(而不仅仅是有序集合),这个方法就不适用了。此外,上述代码中的注释也没有给出如何获取Firebase中的子节点添加事件的说明。

有人测试发现,回调函数只会对`ref.endAt().limit(1)`返回的记录触发一次,对该记录之后添加的新记录不会触发。这个问题是在使用Angularfire 0.8.0进行测试时发现的。

关于这个问题,GitHub上有一篇很好的解释,可以在这里查看:https://gist.github.com/katowulf/6383103

然而,这个链接是在这个Stack Overflow问题之后几年才写的。当时还没有查询和limitToLast()的功能。

有人提出了一个解决方案,即使用一个日期属性来确保在将来检查。具体的实现方式没有给出。

0
0 Comments

Firebase的child_added事件是用于监听在一个特定节点下添加的子节点的事件。然而,有一个问题是,如果使用了limitToLast()方法来限制获取的记录数,那么如果最后一条记录被删除,child_added事件会再次被触发。

为了解决这个问题,一种方法是给每个记录添加一个时间戳,并在触发child_added事件时检查新添加的子节点是否在一秒钟之内,如果超过一秒钟则表示是旧记录,不予添加。可以通过访问ref.child('.info')来实现这个功能。

还有一些人对于child_added事件的行为有疑问,认为它只会获取最后一条记录,不会获取在绑定事件之后添加的其他记录。为了解决这个问题,可以使用ref.endAt()方法来获取从绑定事件时到现在的所有记录,然后在child_added回调函数中使用prevChildKey参数来判断是否为最后添加的记录。

使用child_added事件时需要注意上述问题,并根据具体情况选择相应的解决方法。

0