【问题标题】:Firebase orderByChild with startAt()'s second argument w/ pagination not orderingFirebase orderByChild with startAt()'s second argument w/ pagination not order
【发布时间】:2015-11-06 20:56:41
【问题描述】:

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

      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
          });
      });

现在我要做的是,当用户滚动到页面底部时,我会调用此函数。

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 代码有关。

【问题讨论】:

    标签: firebase firebase-realtime-database


    【解决方案1】:

    抱歉,Tyler 回答得太晚了

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

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

    【讨论】:

    • 哈哈哈。惊人的。
    • 我正在寻找有关此参数的答案以链接到,然后找到了您的问题。仅仅只有不到两年的时间。 :-)
    • 后续问题:如果有人在我们进行第一次查询后点击“赞”会怎样?这意味着第一个参数 numberOfLikes 不再匹配数据库中的内容。 startAt() 还能正常工作吗?
    猜你喜欢
    • 1970-01-01
    • 2021-09-17
    • 2022-12-27
    • 1970-01-01
    • 1970-01-01
    • 2019-05-25
    • 2020-05-29
    • 2017-08-22
    • 2020-12-26
    相关资源
    最近更新 更多