Firebase child_added只能获取到新增的子节点。
Firebase的child_added事件用于监听在特定位置下的子节点添加事件。然而,在使用child_added事件时,有时会遇到只获取新添加的子节点的需求。下面将讨论这个问题出现的原因以及解决方法。
首先,我们需要了解一下Firebase中的push()方法。调用ref.push()方法时,如果不传入数据,则会根据当前时间生成一个路径键。在上面的代码示例中,我们获取了一个基本引用messagesRef,然后通过调用push()方法生成一个键startKey,这个键是根据当前时间生成的。接着,我们使用startAt()方法来获取从startKey开始的所有子节点。
这样做的原因是为了只获取新添加的子节点。通过将startKey传递给startAt()方法,我们可以告诉Firebase只返回从startKey之后添加的子节点。然后,我们使用child_added事件来监听这些新添加的子节点,并进行相应的处理。
需要注意的是,实际上并没有将任何数据写入到ref.push()方法返回的引用或键中,所以不需要捕获空数据。
因此,通过上述代码示例中的方法,我们可以实现只获取新添加的子节点的需求。
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()的功能。
有人提出了一个解决方案,即使用一个日期属性来确保在将来检查。具体的实现方式没有给出。
Firebase的child_added
事件是用于监听在一个特定节点下添加的子节点的事件。然而,有一个问题是,如果使用了limitToLast()
方法来限制获取的记录数,那么如果最后一条记录被删除,child_added
事件会再次被触发。
为了解决这个问题,一种方法是给每个记录添加一个时间戳,并在触发child_added
事件时检查新添加的子节点是否在一秒钟之内,如果超过一秒钟则表示是旧记录,不予添加。可以通过访问ref.child('.info')
来实现这个功能。
还有一些人对于child_added
事件的行为有疑问,认为它只会获取最后一条记录,不会获取在绑定事件之后添加的其他记录。为了解决这个问题,可以使用ref.endAt()
方法来获取从绑定事件时到现在的所有记录,然后在child_added
回调函数中使用prevChildKey
参数来判断是否为最后添加的记录。
使用child_added
事件时需要注意上述问题,并根据具体情况选择相应的解决方法。