当前位置: 首页 > 面试题库 >

无限滚动与AngularJs和Firebase

顾嘉德
2023-03-14
问题内容

如何对从Firebase获取的数据实施无限滚动。到目前为止,我找到了angularjs
指令,该指令确实非常有效,但是由于firebase
在单个请求中返回所有数据,我很难用fireable 实现它,这不是我想要的。


问题答案:

几周前,我做了一个JS函数,允许在我的应用程序中无限滚动。

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

// 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中创建一个索引。为此,我创建了一个:

{
   "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中使用这种方法,无论您的数据量有多大,它的运行速度都非常快。



 类似资料:
  • 问题内容: 我正在尝试使用angularjs无限滚动 它似乎仅在滚动相对于浏览器窗口有效。 我想在内部DIV中进行无限滚动,即我有一个带有通用包装和内部div的页面,用于显示实际内容。 包装页面设置为经过整个窗口,因此它永远不会滚动。但是包含内容的内部div具有自己的滚动条。 如何使无限滚动相对于内部内容div滚动条起作用? 问题答案: 万一有人搜索相同内容并来到这里-这里是有用的链接: http

  • 无限滚动用来在页面滚动到接近底部时加载新内容或进行其他操作。 在底部的无限滚动 你只需在可滚动的容器上添加“infinite-scroll”类,一般是页面滚动区域 - div.content <style type="text/css"> .infinite-scroll-preloader { margin-top:-20px; } </style> <heade

  • 无限滚动用来在页面滚动到接近底部时加载新内容或进行其他操作。 无限滚动HTML结构 你只需在可滚动的容器上添加“infinite-scroll”类,一般是页面滚动区域 - <div class="page-content">: <div class="page"> <div class="page-content infinite-scroll" data-distance="100">

  • 问题内容: 我正在尝试进行反向无限滚动。我有,我收到了近10篇最近的评论,并希望用户能够滚动评论列表 最多 检索下一个10 -类似FB它显示了最近的评论的“获取前”链接,而是通过滚动事件,而不是链接。 我从http://jsfiddle.net/vojtajina/U7Bz9/开始,尝试将其修改为反向无限滚动,并很快以如下形式结束了: http://jsfiddle.net/digger69/Fw

  • 无限滚动 iScroll集成了一套智能缓存系统,它允许对一堆近乎无限的元素的数据进行处理和重用。目前无限滚动还处于早期开发阶段,所以虽然当前版本已经足够稳定,但是还没有做好广泛推广的准备。 具体示例请参考 无限滚动示例 ,并请提交你的建议和报告bug。 作者将会尽可能快的将功能变更的细节添加上来。

  • 滚动至底部时,加载更多数据。 基础用法 在要实现滚动加载的列表上上添加v-infinite-scroll,并赋值相应的加载方法,可实现滚动到底部时自动执行加载方法。 demo <template> <ul class="infinite-list" v-infinite-scroll="load" style="overflow:auto"> <li v-for="i in count