WildDogTeam / wilddog-issue

关于野狗产品的问题,bug反馈和改进意见
2 stars 1 forks source link

如何实现分页? #7

Closed SinanWang closed 8 years ago

SinanWang commented 8 years ago

如果数据集不是静态的,而是不断在插入和删除的,那么分页中页码的定义会变的很麻烦。

如果数据是只写入而没有删除操作,那么分页的实现比较简单,主要有两种方法:

使用priority作为页码

在写入数据的时候,使用priority做为数据的页码。

// 读取第2页数据new Wilddog("https://examples-sql-queries.wilddogio.com/messages")
    .orderByPriority()
    .startAt(2) // 
    .endAt(2)
    .once('value', function(snap) {       console.log('messages :', snap.val());
    });

为数据生成自增字段

参考自增字段。 假设我们为列表数据中的每一条记录都生成了一个自增的字段,就可以计算其页码了。

var startId = (pageNo - 1) * pageSize + 1;var endId = startId + pageSize;new Wilddog("https://examples-sql-queries.wilddogio.com/messages")
    .orderByChild('id')
    .startAt(startId) // 
    .endAt(endId)
    .once('value', function(snap) {       console.log('messages :', snap.val());
    });

依靠上一页的最后一条记录获取下一页数据

如果数据不是append only的,最好的做法是标记上一页取到的最后一条数据,从这一页开始取(适用于上拉加载数据)。

// 加载下一页数据new Wilddog("https://examples-sql-queries.wilddogio.com/pagination")
   .startAt(null, lastKeyOnPrevPage)
   .limitToFirst(LIMIT+1) // 多取一条,因为上一页的最后一条记录会被取出来,需要排除掉
   .once('value', function(snap) {      var vals = snap.val()||{};      delete vals[lastKeyOnPrevPage]; // 排除上一页最后一条记录
      console.log('on this page', vals);
   });
stackOverMind commented 8 years ago

问题已经解决