2017-01-02 4 views
5

私が試しWHAT(正しく動作しません):ファイヤーベースの降順で、私の無限のスクロールで最初に私のトップの投稿を表示するには?

CODE:

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


QUESTION:

はどうやってデータを元に戻しますかクライアント側自分のスコアを(上から下へ)上から下へ投稿するには?


私は達成するためにたいと思うパートナーはどのような:

は無限スクロールと少しトリッキーですスコアに従って降順に私の記事を取得します。

+0

は、あなただけのコンパレータ機能でのArray.sortを使用することができませんでしたか?これが何らかのフレームワークAPIのものなら、それを指摘しないと、$ scopeは角度のように見えますが、ここではわかりません。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort –

+0

@TimConsolazioリンクを見て、sort()はUnicodeのコードポイントを使用しています:私は見ませんどのように私のケースに適用することができます:(おかげで提案!でも^^ – Coder1000

+0

待ってください、コンパレータ関数は、並べ替えの種類を行うために使用することができますストレートArray.sortは、私は(おそらく他の100人のJS開発者のうち90人がこれを使って、あらゆる種類のものに対して非常に強力な効果を得ています。オブジェクトを並べ替える(他の配列との比較など)、オブジェクト自体に含まれていない他の要素でソートすることもできます。 –

答えて

0

私は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> 
0

投稿が逆順で表示されるため、「ページ」の順番を逆にする必要があります(startAtの代わりにendAtを使用)。すべてのページで逆の並べ替えを行います。もっとエレガントな方法については

$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; 
    } 
} 

、あなたミリアンペア:

も参照してくださいthis answer

セットアップ:scrollイベントリスナーのための

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

が機能ストアのスコアを逆に試してみるか、追加の値を使用してください。

fb.orderByChild('reversedScore')

+0

あなたの答えをありがとう!なぜあなたは 'n + firstElementsLoaded'を書いたのですか? 'firstElementsLoaded'はブール値です。 – Coder1000

+1

'if(firstElementsLoaded){n + 1} else {n}'の略語。 – DarkKnight

+0

誤解がないことを確認するために、より多くのコードを表示するように質問を編集しました。 – Coder1000

関連する問題