如何在我的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更多关于订购的信息 。
startAt
和limitToFirst
可以用来检索下一篇文章。
只要告诉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() }) }
- 在从我的承诺/function返回之前等待forEach完成
- Firebase的云端function:pipe理员与根查找
- Firebase:如何以编程方式为类似于`firebase.auth()。currentUser.getIdToken(false)`的特定用户生成一个jwt标记?
- 有没有办法通过我的Node.js服务器发送带有Firebase Admin SDK的validation邮件?
- 在NodeJS应用程序中提交firebase文件的做法是什么?
- 如何通过Firebase Admin与代理连接到Firebase?
- 如何处理“promis”数组
- 本地Firebase服务器节点会引发“Firebase.goOffline不是function”
- 如何在Heroku的Node.js应用程序中从子文件夹redirect到静态JavaScript应用程序?