【问题标题】:Infinite scroll with AngularJs and Firebase使用 AngularJs 和 Firebase 无限滚动
【发布时间】:2014-05-17 02:38:08
【问题描述】:

如何对从 firebase 获取的数据实现无限滚动。到目前为止,我找到了一个 angularjs directive,它的效果非常好,但我很难用 fireable 来实现它,因为 firebase 在一个请求中返回所有数据,这不是我想要的。

【问题讨论】:

  • 如果没有办法在 Firebase 中对数据进行分页,那么无限滚动是没有意义的。但不知何故,我很难相信没有分页功能 - 你搜索过他们的 API 文档吗?
  • 其实就是正是分页。 :) jsfiddle.net/katowulf/yumaB

标签: javascript angularjs firebase infinite-scroll


【解决方案1】:

几周前,我做了一个 JS 函数,允许在 my app 中无限滚动。

首先,用户访问网站时显示一组数据:

// Add a callback that is triggered for each message.
var n = 25; // Step size for messages display.
$(window).load(function() {
lastMessagesQuery = messagesRef.limit(n); 
lastMessagesQuery.on('child_added', function (snapshot) {
  var message = snapshot.val();
  $('<div/>').text(message.text).prependTo($('#messagesDiv'));
  $('#messagesDiv')[0].scrollTop = $('#messagesDiv')[0].scrollHeight;
});
$('#messagesDiv').fadeTo(1000, 1);
});

然后,实现无限滚动的功能:

// Pagination.
var i = 0; // Record variable.
function moreMessages () { 
i += n; // Record pagination updates. 
moreMessagesQuery = messagesRef; // Firebase reference.
moreMessagesQuery.on('value', function (snapshot) {
  var data = snapshot.exportVal(); // Fetch all data from Firebase as an Object.
  var keys = Object.keys(data).reverse(); // Due to the Keys are ordered from the oldest to the newest, it nessesary to change its sequence in order to display Firebase data snapshots properly.
  var total_keys = Object.keys(data).length;
  var k = keys[i]; // Key from where to start counting. Be careful what Key you pick.
  if (i < total_keys) { // Stop displaying messages when it reach the last one.
    lastMessagesQuery = messagesRef.endAt(null, k).limit(n); // Messages from a Key to the oldest.
    lastMessagesQuery.on('child_added', function (snapshot) {
      var message = snapshot.val();
      $('<div/>').text(message.text).appendTo($('#messagesDiv')).hide().fadeIn(1000); // Add set of messages (from the oldest to the newest) at the end of #messagesDiv.
    });
  }  
});
}

最后,无限滚动:

// Load more messages when scroll reach the bottom.
$(window).scroll(function() { 
if (window.scrollY == document.body.scrollHeight - window.innerHeight) {
  moreMessages();
}  
}); 

它适用于小型数据集。我希望这可以帮助您解决问题(或为您提供更多想法)。


2015 年 10 月更新

自从我最初的回复以来,Firebase 有了增长,这意味着现在只需使用它的Javascript API 就可以很容易地实现无限滚动:

首先,我建议您在 Firebase 中使用 create an Index。对于这个答案,我创建了这个:

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

那么,让我们用 Firebase 创造一些魔法吧:

// @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;
}

最后,一个更好的无限滚动(没有jQuery):

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

我将这种方法与React 一起使用,无论您的数据有多大,它的速度都非常快。

【讨论】:

  • 你在哪里添加无限滚动?当我滚动时,我什么也没有发生
  • @JohnAndrews 我将它添加到我的主 JS 文件中。如果您使用 React,只需查看以下示例:github.com/heartyrobot/brands/blob/master/src/js/app.js#L56(顺便说一句,您需要显示 data 以使事情发生。)
  • 这意味着每次调用getDataSet() 时都要注册一个on 侦听器......这合理吗?只有当你想要升序时它才有效。
  • 另外,如果一个孩子被添加到一个已经加载的页面,你的代码会将它推到列表的末尾而不是插入到正确的位置
  • 你是对的@antoine129,我的代码只能按升序工作,但这完全取决于你的要求。您可以轻松地反转 data 数组以满足您的需求...类似于 var _data = data.reverse() 或使用 sort
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-14
  • 1970-01-01
  • 1970-01-01
  • 2015-03-07
  • 2017-01-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多