¿Cómo mostrar mis publicaciones principales primero en mi Desplazamiento infinito, en order descendente con base de fuego?

LO QUE TRATÉ (NO FUNCIONA CORRECTAMENTE):

CÓDIGO:

<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']); 

PREGUNTA:

¿Cómo revertir los datos del lado del cliente para get mis publicaciones de arriba a abajo según su puntaje (de mayor a menor)?


LO QUE ME GUSTARÍA LOGRAR:

Obtener mis publicaciones en order descendente de acuerdo con la puntuación, que es un poco más complicado con el desplazamiento infinito.

Dado que las publicaciones se muestran en order inverso, debe invertir el order de "páginas" (utilice endAt lugar de startAt ) y startAt publicaciones de forma inversa en cada página.

Ver también esta respuesta

Ejemplo

Preparar:

 $scope.data = []; var n = Math.ceil(($(window).height() - 50) / (350)) + 1; var firstElementsLoaded = false; var lastScore = MAX_SCORE, lastKey 

Función para el oyente del evento de scroll :

 $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 ordenetworking = Object.keys(posts).sort(compare).slice(firstElementsLoaded) lastKey = ordenetworking[ordenetworking.length-1] lastScore = posts[lastKey].score ordenetworking.forEach(function(key) { $scope.data.push(posts[key]) }) $scope.$apply(); firstElementsLoaded = true; } } 

Para una forma más elegante, puede probar los puntajes de la tienda de forma inversa o usar un valor adicional.

fb.orderByChild('reversedScore')

Terminé usando una propiedad 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>