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
但我不确定如何在无限滚动中实现这些解决方案。有什么想法吗?
答案 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)
startAt
和limitToFirst
可用于检索下一个帖子。
告诉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()
})
}