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

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

问题描述

我有一个像这样的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.

推荐答案

很抱歉,泰勒的答案太晚了

startAt()的第二个参数是 only ,用于消除与第一个参数匹配的项目之间的歧义.因此,您必须同时输入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.

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

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