Javascript JS中的初学者Firebase:获取后续k项

Javascript JS中的初学者Firebase:获取后续k项,javascript,firebase,Javascript,Firebase,我有一个Firebase数据库,里面有新闻条目,我们总是在头版一次显示10篇文章。我们想让这些文章按时间排序,所以我们一直在做的就是将其放入firebase参考中,如下所示: myDataRef.child("News/").push(json); 我们现在要做的是,如果用户单击next按钮,那么随后的10篇文章将从数据库中加载。我想通过增加一个名为page的变量来实现这一点,该变量正确地保存当前页码 当涉及到查询本身时,问题就出现了。因为snapshot.val()似乎总是空的

我有一个Firebase数据库,里面有新闻条目,我们总是在头版一次显示10篇文章。我们想让这些文章按时间排序,所以我们一直在做的就是将其放入firebase参考中,如下所示:

myDataRef.child("News/").push(json);
我们现在要做的是,如果用户单击next按钮,那么随后的10篇文章将从数据库中加载。我想通过增加一个名为page的变量来实现这一点,该变量正确地保存当前页码

当涉及到查询本身时,问题就出现了。因为snapshot.val()似乎总是空的

        myDataRef.child("News").startAt(page*10).endAt(page*10+10).once('value',function(snapshot){
             console.log(snapshot.val())
        });
即使我将查询更改为硬编码:

 myDataRef.child("News").startAt(0).endAt(10).once('value',function(snapshot){
            console.log(snapshot.val())
 });
它仍然记录一个空值。我确信“新闻”数据库中至少有50个条目。因此,我相信问题出在哪里


感谢您的帮助

在使用帮助器方法(如
startAt
&
endAt
)之前,似乎需要对数据进行排序。这是因为
startAt
查找某些属性的匹配项,而不是特定索引。即使您的文章中有一些日期或时间戳属性,并尝试
orderByChild('time')
您也无法真正链接
.startAt(第*10页)
,因为它会在时间属性上查找匹配项,时间属性可能是整数,也可能不是整数

为了避免这种情况,您可以使用一些
totalArticles
变量,该变量在存储新文章时会得到更新。然后,如果您为每个文章添加一个
articleNumber
属性,该属性与保存时的
totalArticles
相对应,则可以
orderByChild('articleNumber').startAt(第*10页).endAt(第*10+10页)

或者,
startAt
的第二个参数可以是键或索引

请参阅此处的更多信息: 及

编辑: 查看firebase博客上的这篇精彩文章,它详细解释了这个问题,由@FrankvanPuffelen提供:

这似乎是一个很好的解决方法,但如果我删除文章会发生什么?在动态实时数据库(如Firebase)中,您不应该依赖完全按顺序排列的键。当多个用户最终同时添加项目时,这些将成为瓶颈。Firebase的
push
方法生成的密钥非常适合于类似数组的用例,它们将与
startAt
endAt
完美配合。另请参见本文中的示例:。请记住,它还提前了
orderBy…
方法的日期,因此您现在有了更多(但类似的)选项。加藤的这篇文章在谈到数组时更好地解释了Firebase的推理:谢谢@FrankvanPuffelen!我目前正在使用您显示的资源进行分页,而且它工作得非常好!我会让你不断更新那篇文章已经过时了。相同材料的。请参阅此问题和答案,了解前一段时间如何使用:。即使使用新的
orderBy…
方法,操作仍然相当类似:您记住显示的最后一项,并从该项开始进入下一页。如果您使用了“连续增加但不一定连续”键(如调用
push
时Firebase生成的键)这将非常有效:
startAt
将返回下一个键,如果在这种情况下删除了当前键。阅读和吸收所有这些基础知识将是理解这一点的极好入门。