2016-11-30 36 views
0

我正在使用AngularFire2,只是无法获得查询部分。 “limitToLast:1”正在返回所有内容,而不仅仅是最近的条目。我需要一种方法来按顺序编号我的工作,我想获得最新的作业ID(4),所以我可以添加+ 1,使下一个5limitToLast:1个查询返回所有内容

job: FirebaseObjectObservable<any>; 
test: any; 

constructor(af: AngularFire) { 
    this.job = af.database.object('/jobs/', { 
     query:{ limitToLast: 1 } 
    }); 
}; 

createNewJob(){ 
    this.job.subscribe(snap => { 
     this.test = snap; 
    }); 
} 

相反的输出我的单身最近进入我得到的一切:

[ null, 
     { "customer": "Heather D", "description": "Work needs to be done" }, 
     { "customer": "Quick G", "description": "Unclog toilet" }, 
     { "customer": "Justin S", "description": "Do everything for everyone" } 
     { "customer": "Jeff F", "description": "Ikea furniture" } 
] 

HTML

<button (click)="createNewJob()"> Create </button> 
{{ test | json }} 

这里是我的结构

ROOT 
    jobs 
     1 
      customer: "Heather D" 
      description: "Work needs to be done" 
     2 
      customer: "Quick G" 
      description: "Unclog toilet" 
     3 
      customer: "Justin S" 
      description: "Do everything for everyone" 
     4 
      customer: "Jeff F" 
      description: "Ikea furniture" 

更新1:

仍然有同样的问题,但我觉得这是一个正确的方向迈出的一步。如我错了请纠正我。我已经给我的工作现在一个唯一的ID,这似乎是多余的给我,但新的结构是这样的:

ROOT 
    jobs 
     1 
      customer: "Heather D" 
      description: "Work needs to be done" 
      id: 1 
     2 
      customer: "Quick G" 
      description: "Unclog toilet" 
      id: 2 
     3 
      customer: "Justin S" 
      description: "Do everything for everyone" 
      id: 3 
     4 
      customer: "Jeff F" 
      description: "Ikea furniture" 
      id: 4 

,然后我改变了我的查询:

query:{ orderByChild: 'id', limitToLast: 1 } 

同样的结果,仍不限于只有一份工作。

回答

0

问题是,您使用的是object而不是list。当使用object时,query选项将被忽略。也就是说,你应该使用这样的事情:

job: FirebaseListObservable<any>; 
test: any; 

constructor(af: AngularFire) { 
    this.job = af.database.list('/jobs/', { 
     query:{ limitToLast: 1 } 
    }); 
}; 

FirebaseListObservable应发出包含上次作业的阵列。

但是,使用FirebaseListObservable实例的push方法会更安全,而不是读取并递增上一个作业ID。也Saving Lists of Data参见:

当数据push()列表工作确保一个独特的和时间的关键。您可能会试图使用交易来生成您自己的密钥,但推送是一个更好的选择。事务更慢,更复杂。他们需要一次或多次往返服务器。客户端上的push()生成的密钥在脱机状态下工作,并针对性能进行了优化。

+0

哦,我会尝试列表,让你知道!至于push(),我想用这个,但我仍然需要我的工作(工作编号:7051354)可以推送吗?你是说我根本不应该使用交易,或者交易是我唯一的选择吗? – Jus10

+0

它的工作!我得到了一个结果!最后!大声笑。现在我对结果有一个小副作用。查询:{orderByChild:'id',limitToFirst:1}给了我第三个结果。不是首先或最后。我改变它查询:{limitToLast:1},它的工作....但....任何人都知道为什么会给我在我的列表中的结果? – Jus10

0

为什么不按工作ID的降序对记录进行排序并将其限制为第一个?这会得到最后一个记录

+0

我似乎无法找到任何文档,会看起来像orderByChild:'降序'? – Jus10

+0

我只是运行{query:['orderByChild',{limitToFirst:1}]}来测试我在线看到的一些示例,并且它也返回了整个列表。我不知道这是否是有效的代码,但它没有给出错误,所以我猜测它是?大声笑。无论哪种方式,仍然坚持我的原始问题6小时现在:( – Jus10