Javascript 如何在我的无限卷轴中以降序显示我的顶级帖子?
我尝试的内容(无法正常工作):Javascript 如何在我的无限卷轴中以降序显示我的顶级帖子?,javascript,angularjs,firebase,firebase-realtime-database,Javascript,Angularjs,Firebase,Firebase Realtime Database,我尝试的内容(无法正常工作): <script> var app = angular.module('app', ['firebase']); app.controller('ctrl', function ($scope, $firebaseArray, $timeout) { $scope.data = []; var _n = Math.ceil(($(window).height() - 50) / (3
<script>
var app = angular.module('app', ['firebase']);
app.controller('ctrl', function ($scope, $firebaseArray, $timeout) {
$scope.data = [];
var _n = Math.ceil(($(window).height() - 50) / (350)) + 1;
var start = 0;
var end = _n - 1;
var lastScore = <%=lastScore%>;
console.log("FIRST FIRST FIRST LAST SCORE:" + lastScore);
var firstElementsLoaded = false;
$scope.getDataset = function() {
fb.orderByChild('score').endAt(lastScore).limitToLast(_n).on("child_added", function(dataSnapshot) {
lastScore = dataSnapshot.child("score").val() - 1;
console.log("LAST TOP LIKED:"+ lastScore);
$scope.data.push(dataSnapshot.val());
$scope.$apply();
console.log("THE VALUE:"+$scope.data);
$scope.data.splice(start, end).concat($scope.data.reverse());
$scope.$apply();
start = start + _n;
end = end + _n
firstElementsLoaded = true;
});
};
$scope.getDataset();
window.addEventListener('scroll', function() {
if (firstElementsLoaded == true) {
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>
var app = angular.module('app', ['firebase']);
app.controller('ctrl', function ($scope, $firebaseArray, $timeout) {
$scope.data = [];
var _n = Math.ceil(($(window).height() - 50) / (350)) + 1;
var start = 0;
var end = _n - 1;
var lastScore = <%=lastScore%>;
console.log("FIRST FIRST FIRST LAST SCORE:" + lastScore);
var firstElementsLoaded = false;
$scope.getDataset = function() {
fb.orderByChild('score').endAt(lastScore).limitToLast(_n).on("child_added", function(dataSnapshot) {
lastScore = dataSnapshot.child("score").val() - 1;
console.log("LAST TOP LIKED:"+ lastScore);
$scope.data.push(dataSnapshot.val());
$scope.$apply();
console.log("THE VALUE:"+$scope.data);
$scope.data.splice(start, end).concat($scope.data.reverse());
$scope.$apply();
start = start + _n;
end = end + _n
firstElementsLoaded = true;
});
};
$scope.getDataset();
window.addEventListener('scroll', function() {
if (firstElementsLoaded == true) {
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']);
var app=angular.module('app',['firebase']);
app.controller('ctrl',函数($scope,$firebaseArray,$timeout){
$scope.data=[];
var_n=Math.ceil(($(window.height()-50)/(350))+1;
var start=0;
var end=_n-1;
var lastScore=;
log(“首末分数:+lastScore”);
var firstElementsLoaded=false;
$scope.getDataset=function(){
fb.orderByChild('score').endAt(lastScore).limitToLast(_n).on('child_added',函数(dataSnapshot){
lastScore=dataSnapshot.child(“score”).val()-1;
log(“最新排名:+lastScore”);
$scope.data.push(dataSnapshot.val());
$scope.$apply();
log(“值:+$scope.data”);
$scope.data.splice(开始、结束).concat($scope.data.reverse());
$scope.$apply();
开始=开始+\n;
结束=结束+\n
firstElementsLoaded=真;
});
};
$scope.getDataset();
addEventListener('scroll',function(){
if(firstElementsLoaded==true){
if(window.scrollY===document.body.scrollHeight-window.innerHeight){
$scope.$apply($scope.getDataset());
}
}
});
});
//使用名为“app”的角度模块编译整个
引导(document.body,['app']);
问题:
<script>
var app = angular.module('app', ['firebase']);
app.controller('ctrl', function ($scope, $firebaseArray, $timeout) {
$scope.data = [];
var _n = Math.ceil(($(window).height() - 50) / (350)) + 1;
var start = 0;
var end = _n - 1;
var lastScore = <%=lastScore%>;
console.log("FIRST FIRST FIRST LAST SCORE:" + lastScore);
var firstElementsLoaded = false;
$scope.getDataset = function() {
fb.orderByChild('score').endAt(lastScore).limitToLast(_n).on("child_added", function(dataSnapshot) {
lastScore = dataSnapshot.child("score").val() - 1;
console.log("LAST TOP LIKED:"+ lastScore);
$scope.data.push(dataSnapshot.val());
$scope.$apply();
console.log("THE VALUE:"+$scope.data);
$scope.data.splice(start, end).concat($scope.data.reverse());
$scope.$apply();
start = start + _n;
end = end + _n
firstElementsLoaded = true;
});
};
$scope.getDataset();
window.addEventListener('scroll', function() {
if (firstElementsLoaded == true) {
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>
var app = angular.module('app', ['firebase']);
app.controller('ctrl', function ($scope, $firebaseArray, $timeout) {
$scope.data = [];
var _n = Math.ceil(($(window).height() - 50) / (350)) + 1;
var start = 0;
var end = _n - 1;
var lastScore = <%=lastScore%>;
console.log("FIRST FIRST FIRST LAST SCORE:" + lastScore);
var firstElementsLoaded = false;
$scope.getDataset = function() {
fb.orderByChild('score').endAt(lastScore).limitToLast(_n).on("child_added", function(dataSnapshot) {
lastScore = dataSnapshot.child("score").val() - 1;
console.log("LAST TOP LIKED:"+ lastScore);
$scope.data.push(dataSnapshot.val());
$scope.$apply();
console.log("THE VALUE:"+$scope.data);
$scope.data.splice(start, end).concat($scope.data.reverse());
$scope.$apply();
start = start + _n;
end = end + _n
firstElementsLoaded = true;
});
};
$scope.getDataset();
window.addEventListener('scroll', function() {
if (firstElementsLoaded == true) {
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']);
根据分数按降序获取我的帖子,这对于无限滚动来说有点棘手。因为帖子是以相反的顺序显示的,所以你应该颠倒“页面”的顺序(使用
endAt
而不是startAt
),并在每页中反向排序帖子
另见
示例
设置:
$scope.data = [];
var n = Math.ceil(($(window).height() - 50) / (350)) + 1;
var firstElementsLoaded = false;
var lastScore = MAX_SCORE, lastKey
用于滚动
事件侦听器的功能:
$scope.getDataset = function() {
fb.orderByChild('score')
.endAt(lastScore, lastKey)
//endAt is inclusive, take one more for the n-th
.limitToLast(n + firstElementsLoaded)
.once('value', loadPosts)
function loadPosts(snapshot) {
var posts = snapshot.val()
function compare(a, b) {
if (posts[a].score != posts[b].score) {
return b.score - a.score
}
if (a < b) return 1
if (a > b) return -1
return 0
}
//skip the post included by endAt
var ordered = Object.keys(posts).sort(compare).slice(firstElementsLoaded)
lastKey = ordered[ordered.length-1]
lastScore = posts[lastKey].score
ordered.forEach(function(key) {
$scope.data.push(posts[key])
})
$scope.$apply();
firstElementsLoaded = true;
}
}
$scope.getDataset=function(){
fb.orderByChild('score'))
.endAt(lastScore,lastKey)
//endAt已包含在内,第n次再取一个
.limitToLast(n+第一个元素sloaded)
.一次(“价值”,装货柱)
函数加载柱(快照){
var posts=snapshot.val()
功能比较(a、b){
如果(发布[a]。得分!=发布[b]。得分){
返回b.score-a.score
}
如果(ab)返回-1
返回0
}
//跳过endAt包含的帖子
var ordered=Object.keys(posts).sort(compare).slice(firstElementsLoaded)
lastKey=ordered[ordered.length-1]
lastScore=发布[lastKey]。得分
ordered.forEach(函数(键){
$scope.data.push(发布[key])
})
$scope.$apply();
firstElementsLoaded=真;
}
}
对于更优雅的方式,您可以尝试反向存储分数,或者使用附加值
fb.orderByChild('reversedScore')
我最终使用了inversedScore属性:
<script>
var app = angular.module('app', ['firebase']);
app.controller('ctrl', function ($scope, $firebaseArray, $timeout) {
$scope.data = [];
var _n = Math.ceil(($(window).height() - 50) / (350)) + 1;
var firstElementsLoaded = false;
var lastScore = -100000;
$scope.getDataset = function() {
fb.orderByChild('inversedScore').startAt(lastScore).limitToFirst(_n).on("child_added", function(dataSnapshot) {
lastScore = dataSnapshot.child("inversedScore").val() + 1;
console.log("LAST LIKE SCORE:"+ lastScore);
$scope.data.push(dataSnapshot.val());
$scope.$apply();
console.log("THE VALUE:"+$scope.data);
firstElementsLoaded = true;
});
};
$scope.getDataset();
window.addEventListener('scroll', function() {
if (firstElementsLoaded == true) {
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>
var app=angular.module('app',['firebase']);
app.controller('ctrl',函数($scope,$firebaseArray,$timeout){
$scope.data=[];
var_n=Math.ceil(($(window.height()-50)/(350))+1;
var firstElementsLoaded=false;
var lastScore=-100000;
$scope.getDataset=function(){
fb.orderByChild('inversedScore').startAt(lastScore).limitToFirst(\n).on(“添加的子项”),函数(dataSnapshot){
lastScore=dataSnapshot.child(“inversedScore”).val()+1;
log(“LAST LIKE SCORE:+lastScore”);
$scope.data.push(dataSnapshot.val());
$scope.$apply();
log(“值:+$scope.data”);
firstElementsLoaded=真;
});
};
$scope.getDataset();
addEventListener('scroll',function(){
if(firstElementsLoaded==true){
if(window.scrollY===document.body.scrollHeight-window.innerHeight){
$scope.$apply($scope.getDataset());
}
}
});
});
//使用名为“app”的角度模块编译整个
引导(document.body,['app']);
难道不能将Array.sort与比较器函数一起使用吗?如果这是某种框架API,您不会指出,$scope使它看起来像角度,但我不确定@Timconolazio我查看了链接,发现sort()使用Unicode代码点:我不知道如何将其应用到我的案例中:(不过感谢您的建议!^^^请稍候,comparator函数可用于执行任何类型的排序。Straight Array.sort将使用unicode比较,但您可以提供一个函数作为参数来执行任何类型的比较。请继续阅读页面底部的.I(可能每100个JS开发人员中就有90个)你可以对对象进行排序,按对象本身不包含的其他因素进行排序(比如与另一个数组进行比较),几乎可以做任何事情。@TimConsolazio我明白了:)好的,我的问题主要是什么时候在我的代码中真正调用sort。更准确地说,什么时候调用scope.apply,什么时候调用sort()以及正确的Firebase func vars。如果你能提供一段代码来产生我正在寻找的行为,或者建议