2016-11-30 27 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