如何在我的Firebase无限滚动中按时间顺序正确排序数据?

时间:2016-12-25 17:47:59

标签: javascript node.js firebase firebase-realtime-database

CODE:

<script>

    var app = angular.module('app', ['firebase']);

    app.controller('ctrl', function ($scope, $firebaseArray, $timeout) {


            console.log(<%=lastID%>);

            $scope.data = [];
            var _n = Math.ceil(($(window).height() - 50) / (350)) + 1;
            var _start = <%= lastID %>;
            var _end = <%= lastID %> + _n - 1;

            $scope.getDataset = function() {

                fb.orderByChild('id').startAt(_start).endAt(_end).limitToLast(_n).on("child_added", function(dataSnapshot) {

                    $scope.data.push(dataSnapshot.val());
                    $scope.$apply()
                    console.log("THE VALUE:"+$scope.data);

                });

                _start = _start + _n;
                _end = _end + _n;

            };


            $scope.getDataset();

            window.addEventListener('scroll', function() {
                 if (window.scrollY === document.body.scrollHeight - window.innerHeight) {
                      $scope.$apply($scope.getDataset());
                 } 
            });

    });

    // Compile the whole <body> with the angular module named "app"
    angular.bootstrap(document.body, ['app']);


</script>

状况:

lastID是最后发布的帖子的ID。它们向后(从-1到lastID)。

除非删除某些帖子,否则此解决方案可以正常运行。

(帖子从最新到最旧(从lastID到-1)排序。)

例如,如果有16个帖子,则lastID = -16。

如果我删除帖子-13到-5并发布-3,则lastID保持在-16。

这意味着当页面加载时,在加载3个第一个帖子(-16到-14)后没有帖子出现,我需要反复向下滚动才能显示帖子-4。

问题:

如何确保删除某些帖子后,我的无限滚动脚本会跳过不存在的帖子的ID,只加载最近的3个帖子?

我检查了什么:

我看了看这个:

Display posts in descending posted order

但我不确定如何在无限滚动中实现这些解决方案。有什么想法吗?

3 个答案:

答案 0 :(得分:1)

如果我理解正确,你就不必使用结束。这可以使用startAt + limit

来实现
fb.orderByChild('id').startAt(_start).limit(n)...

并使用布局来下订单。使用它你不必担心如果它们是连续的id序列

<强>更新

你可以做得更简单。只需使用最新值

更新您的开头
fb.orderByChild('id').startAt(_start).limit(_n).on("child_added", function(dataSnapshot) {

    $scope.data.push(dataSnapshot.val());
    $scope.$apply()
    _start = dataSnapshot.child('id').val()
    console.log("THE VALUE:"+$scope.data);

});

在这种情况下,您的_start将始终保留最后一个ID,您可能不会担心已删除的元素。 或者,您可以使用临时变量来存储最后一个id值,并在startAt

中使用它

答案 1 :(得分:1)

基本上,Firebase中保存的所有数据都按时间顺序排序,因为每条记录的自动生成ID都基于时间戳。因此,您无需订购价值。只需确保在Firebase中保存的键值对中添加新ID。

如果您想要反转列表的顺序(使最新的记录显示在顶部),您需要在阅读后反转列表。

修改

如果您想在数据库中获取记录的位置,可以使用类似于以下内容的内容:

for

您可以找到有关订购here的更多信息。

答案 2 :(得分:1)

startAtlimitToFirst可用于检索下一个帖子。

告诉firebase在上次加载帖子的id后开始(在这种情况下为start + 1),系统会自动跳过已删除的id

var itemsPerScroll = 1;
$scope.getDataset = function() {
  var start = $scope.data.slice(-1)[0].id
  fb.orderByChild('id').startAt(start + 1).limitToFirst(itemsPerScroll)
  .on("child_added", function(dataSnapshot) {
    $scope.data.push(dataSnapshot.val());
    $scope.$apply()
  })
}