2016-11-21 140 views
0

Im使用AngularFire+Firebase且数据位于firebase-databaseFirebase范围查询

我试着用Smart Table

我的问题进行分页的数据是,我不知道如何不指定任何孩子I,E取从记录#25记录,以35

范围查询下面的查询给了我第一5条

var queryFIrst = visitRef.startAt().limitToFirst(5); 
$scope.Visits = $firebaseArray(queryFIrst); 

现在我试着让接下来的5条记录,从6到10,我尝试下面

var queryFIrst = visitRef.startAt().limitToFirst(5).endAt().limitToFirst(5); 
$scope.Visits = $firebaseArray(queryFIrst); 

,但它给错误startAtendAt不能像这样使用与limit

回答

1

一般分页是不适合用于火力地堡的实时数据模型/ API。您正在尝试建模SQL SKIP运算符,该运算符不适用于Firebase数据库。

但是,如果您想在Firebase中对分页进行建模,则应该考虑拥有“定位点”。

当您加载第一页时,该页面上的最后一项成为定位点。当您想要加载下一页时,您将创建一个查询,该查询从锚点开始并加载n + 1个项目。

在伪代码(这是真正的JavaScript,我只是不运行它):当你想要加载项的下一页

var page1 = visitRef.orderByKey().limitToFirst(5); 
var anchorKey; 
page1.on('child_added', function(snapshot) { 
    anchorKey = snapshot.key; // this will always be the last child_added we received 
}); 

现在,您可以创建开始于一个新的查询锚关键:

var page2 = visitRef.orderByKey().startAt(anchorKey).limitToFirst(6); 

有几件事情,这里要注意:

  • 你似乎使用从火力地堡1.x的SDK的方法,如一个空的startAt()。尽管这些代码仍然可以工作,但我的代码片段使用了3.x SDK的语法/习惯用法。
  • 对于第二页,您需要加载一个额外的项目,因为两个页面都加载了锚点项目。
  • 如果您希望能够分页回来,您还需要页面开始处的定位键。
+0

感谢您的回答,我总是期待您的回答,我使用Firebase 3.x.然而,我从SO的某个地方拿走了那个空的startAt()。根据你的回答,这意味着如果用户点击转到最后一页或者第一个转到后面,用户是否需要存储非常开始的定位点和最后一个定位点,以及用户前往下一页或前一页,必须对其进行跟踪。所以理论的结果是,使用Firebase是一项复杂的任务 –