6

QUESTION:ジャバスクリプト(およびNode.jsの)を使用してFirebaseでの効率的な無限スクロールを実装する方法新しいFirebase(2016)で無限スクロールを実装する方法は?


私がチェックWHAT:

Implementing Infinite Scrolling with Firebase?

問題:古いfirebase^

Infinite scroll with AngularJs and Firebase


コードからを: Infinite scroll with AngularJs and Firebase

"まず、Firebaseにインデックスを作成することをお勧めします。この回答のために、私はこの1つを作成します。

{ 
    "rules": { 
     ".read": true, 
     ".write": false, 
     "messages": { 
     ".indexOn": "id" 
     } 
    } 
} 

それでは、Firebaseでいくつかの魔法を作ってみよう:(jQueryのなし)

// @fb: your Firebase. 
// @data: messages, users, products... the dataset you want to do something with. 
// @_start: min ID where you want to start fetching your data. 
// @_end: max ID where you want to start fetching your data. 
// @_n: Step size. In other words, how much data you want to fetch from Firebase. 
var fb = new Firebase('https://<YOUR-FIREBASE-APP>.firebaseio.com/'); 
var data = []; 
var _start = 0; 
var _end = 9; 
var _n = 10; 
var getDataset = function() { 
    fb.orderByChild('id').startAt(_start).endAt(_end).limitToLast(_n).on("child_added", function(dataSnapshot) { 
     data.push(dataSnapshot.val()); 
    }); 
    _start = _start + _n; 
    _end = _end + _n; 
} 

最後に、より良い無限スクロール:

window.addEventListener('scroll', function() { 
    if (window.scrollY === document.body.scrollHeight - window.innerHeight) { 
    getDataset(); 
    } 
}); 

私はReactでこのアプローチを使用しています。データがどれほど大きくても速く燃えています。 "

その溶液にJobsamuelによってCT 15時02分で26 '15)

()


PROBLEM

、Nポストはスクロール高さの端部に到達するたびにロードされます画面の

画面サイズによっては、必要以上に多くの投稿がロードされることがあります(画面の高さには2つの投稿のみが含まれているため、必要以上に3つの投稿がロードされます。例えばn = 5のときの画面の高さ)。

つまり、3*NumberOfTimesScrollHeightHasBeenPassedは、スクロール高さの最後に到達するたびに必要以上の投稿が読み込まれることを意味します。


MY CURRENT CODE(一度にロードするすべての記事、ノー無限スクロール):

var express = require("express"); 
var router = express.Router(); 

var firebase = require("firebase"); 

router.get('/index', function(req, res, next) { 

    var pageRef = firebase.database().ref("posts/page"); 

    pageRef.once('value', function(snapshot){ 
     var page = []; 
     global.page_name = "page"; 
     snapshot.forEach(function(childSnapshot){ 
      var key = childSnapshot.key; 
      var childData = childSnapshot.val(); 
      page.push({ 
       id: key, 
       title: childData.title, 
       image: childData.image 
      }); 
     }); 
     res.render('page/index',{page: page}); 
    }); 
}); 
+0

Firebase APIで無限スクロールが容易になるように変更されたものはありません。これは、APIにとって唯一のユースケースです。 –

答えて

3

ここで無限のページングのための完全なコードです。

関数createPromiseCallbackは、約束とコールバックの両方をサポートするためのものです。

function createPromiseCallback() { 
    var cb; 
    var promise = new Promise(function (resolve, reject) { 
     cb = function (err, data) { 
      if (err) return reject(err); 
      return resolve(data); 
     }; 
    }); 
    cb.promise = promise; 
    return cb; 
} 

機能getPaginatedFeedは、実際のページング

function getPaginatedFeed(endpoint, pageSize, earliestEntryId, cb) { 
    cb = cb || createPromiseCallback(); 

var ref = database.ref(endpoint); 
    if (earliestEntryId) { 
    ref = ref.orderByKey().endAt(earliestEntryId); 
    } 
    ref.limitToLast(pageSize + 1).once('value').then(data => { 
    var entries = data.val() || {}; 

    var nextPage = null; 
    const entryIds = Object.keys(entries); 
    if (entryIds.length > pageSize) { 
     delete entries[entryIds[0]]; 
     const nextPageStartingId = entryIds.shift(); 
     nextPage = function (cb) { 
      return getPaginatedFeed(endpoint, pageSize, nextPageStartingId,      cb); 
     }; 
    } 
    var res = { entries: entries, nextPage: nextPage }; 
    cb(null, res); 
    }); 
    return cb.promise; 
} 

そして、ここでは、画面上に置くためにどのように多くの項目の質問については何のことができます。getPaginatedFeed機能

var endpoint = '/posts'; 
var pageSize = 2; 
var nextPage = null; 
var dataChunk = null; 
getPaginatedFeed(endpoint, pageSize).then(function (data) { 
    dataChunk = data.entries; 
    nextPage = data.nextPage; 

    //if nexPage is null means there are no more pages left 
    if (!nextPage) return; 

    //Getting second page 
    nextPage().then(function (secondpageData) { 
     dataChunk = data.entries; 
     nextPage = data.nextPage; 
     //Getting third page 
     if (!nextPage) return; 

     nextPage().then(function (secondpageData) { 
      dataChunk = data.entries; 
      nextPage = data.nextPage; 
      //You can call as long as your nextPage is not null, which means as long as you have data left 
     }); 
    }); 

}); 

を使用する方法である実装しますこのような解決策を与えてください。各ポストは固定されたxの高さを与えます。ポストの下部に "read more"ユーザーがクリックしたときに欠落部分。その場合、画面上のアイテムの数を一定に保つことができます。さらに、画面の解像度を確認して、多かれ少なかれアイテムを置くことができます。

+0

フィードはどのようにトリガーされるべきですか?私は1 * scrollHeightをスクロールするだけで、画面の高さが収まるように多くのポストをロードするようにしたいと思います。 – Coder1000

+1

最初に画面に表示する投稿の数を決め、 'getPaginatedFeed(endpoint、pageSize)'関数を正しい 'pageSize'で初期化してから、スクロールイベントtrigerrsを呼び出すたびに' nextPage'関数を呼び出すことができます別のデータを提供します。 スクロールイベントは、データの下部に到達したときにのみ発生します。 –

+0

しかし、私のスクロールイベントは何ですか?スクロールハイトを行うと、結果は同じままになります。サイズがどのようなものであれ2つの投稿が画面に表示されます。 2つのポストの高さの合計が私の画面よりも高い場合、必要以上に多くのデータが読み込まれ、帯域幅が無駄になります。 2つのポストを組み合わせた高さが私の画面サイズよりもはるかに小さい場合(私は非常に大きな画面がある場合)、ユーザーは必要以上にスクロールする必要があり、2つのポストの間に大きな空白があります。それは問題です:/ – Coder1000

関連する問題