Firebase orderByChild 与 startAt() 的第二个参数,分页未排序 [英] Firebase orderByChild with startAt()'s second argument w/ pagination not ordering

查看:15
本文介绍了Firebase orderByChild 与 startAt() 的第二个参数,分页未排序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个像这样的 Firebase 调用,

I have a Firebase invocation which looks like this,

      ref.child(`floorPosts/${this.props.floorName}`)
        .orderByChild('numberOfLikes')
        .limitToLast(15)
        .once('value', (snapshot) => {
          var topPosts = [];
          snapshot.forEach((childSnapshot) => {
            var post = childSnapshot.val();
            post.key = childSnapshot.key();
            topPosts.unshift(post);
          });
          this.lastPostKeyTop = topPosts[topPosts.length - 1].key;
          this.setState({
            topPosts,
            isLoading: false
          });
      });

现在我想要做的是,当用户滚动到页面底部时,我调用这个函数.

Now what I'm trying to do, is when the user scrolls to the bottom of the page, I invoke this function.

ref.child(`floorPosts/${this.props.floorName}`)
    .orderByChild('numberOfLikes')
    .startAt(null, this.lastPostKeyTop)
    .limitToLast(15)
    .once('value', (snapshot) => {
      var topPosts = [];
      snapshot.forEach((childSnapshot) => {
        var post = childSnapshot.val();
        post.key = childSnapshot.key();
        topPosts.unshift(post);
      });
      this.setState({
        topPosts: this.state.topPosts.concat(topPosts),
        isLoading: false,
      });
  });

但是,它连接了与最初相同的前 15 个结果..startAt 接受第二个参数,它(我相信)是从 firebase 初始获取的最后一个项目的键.但是,这在我的情况下似乎不起作用.我有一种预感,这与 snapshot.forEach 代码有关.

However, it's concatenating the same first 15 results as it initially did. .startAt takes in a a second argument, which (I believe) is the key of the last item which was fetched from firebase the initial fetching. However, this doesn't seem to be working in my case. I have a hunch it's something to do with the snapshot.forEach code.

推荐答案

对不起 Tyler

startAt() 的第二个参数用于消除与第一个参数匹配的项目之间的歧义.因此,您必须同时传入 numberOfLikes 的值以开始于 第一页最后一项的键(通常称为锚项).

The second argument to startAt() is only used to disambiguate between items that match the first argument. So you must pass in both the value of numberOfLikes to start at and the key of the last item on the first page (often referred to as the anchor item).

另请注意,这意味着下一组结果的第一项将与前一组结果中的最后一项相同.因此,您需要检索一件额外的物品.

Also note that this means the first item of the next set of results will be the same as the last item in the previous set of results. So you'll need to retrieve one extra item.

这篇关于Firebase orderByChild 与 startAt() 的第二个参数,分页未排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆