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

码:

<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是最后创build的post的ID。 他们后退(从-1到lastID)。

除了某些post被删除之外,这个解决scheme可以很好的工

(post从最新到最旧(从lastID到-1))。

例如,如果有16个职位,lastID = -16。

如果我删除-13到-5和-3后,lastID保持在-16。

这意味着当页面加载时,3个第一篇文章(-16到-14)被加载后,没有post出现,我需要反复滚动以获得-4后出现。


题:

我怎样才能确保如果一些post被删除,我的无限滚动脚本将跳过无形的post的ID,只是加载3个最接近的职位?


我检查了什么:

我看着这个:

以降序显示post显示post

但我不知道如何在我的无限滚动中实现这些解决scheme。 有任何想法吗 ?

如果我正确地理解了你,你不必用尽。 这可以使用startAt +限制来实现

 fb.orderByChild('id').startAt(_start).limit(n)... 

并使用布局来订购物品降序。 使用这个,你不必担心如果连续的ID序列

UPDATE

你可以做到这一点更简单。 只需更新您的开始与最新的价值

 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,您不必担心被删除的元素。 或者,您可以使用一个临时variables来存储最后的id值,并在startAt使用它

基本上所有保存在Firebase中的数据都是按照时间顺序排列的,因为每条logging的自动生成的ID都是基于时间戳的。 因此你不需要订购你的价值。 只要确保您在保存在Firebase中的键值对中添加了新的ID即可。

如果您想要颠倒列表的顺序(使最近的logging出现在顶部),您需要在阅读列表后反转列表。

编辑

如果你想获得你的logging在数据库中的位置,你可以使用类似于以下内容的东西:

 var ref = new Firebase("https://dinosaur-facts.firebaseio.com/dinosaurs"); ref.orderByKey().on("child_added", function(snapshot) { console.log(snapshot.key() + " was " + snapshot.val().height + " meters tall"); }); 

你可以在这里find更多关于订购的信息 。

startAtlimitToFirst可以用来检索下一篇文章。

只要告诉firebase在最后加载的post的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() }) }