Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/440.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在我的无限卷轴中以降序显示我的顶级帖子?_Javascript_Angularjs_Firebase_Firebase Realtime Database - Fatal编程技术网

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。如果你能提供一段代码来产生我正在寻找的行为,或者建议