2013-08-16 48 views
18

我正在嘗試爲我的網站管理員創建簡單的通知系統,並且我只需要向每個管理員用戶發送實時消息。但是,當我使用Firebase時,它會在每個頁面上加載舊數據,並且用戶會看到數據庫中的所有消息。如果我設置的限制(1)用戶將看到每個頁面重新加載最後通知:如何只檢索新數據?

var eventsList = new Firebase('https://*****-messages.firebaseio.com/'); 

eventsList.on('child_added', function(message) { 
    var message = message.val(); 
    $.notification(message.message); 
}); 

我怎麼能只加載新的消息,不老的通知歷史?

+1

作爲火力地堡2.X的,現在有一些更快的方式做到這一點使用查詢。見備選答案[如何丟棄火力地堡DB初始數據(http://stackoverflow.com/a/27693310/394010) – Kato

+0

由於常見用法這個問題是創建一個消息隊列,最好答案是使用一個[消息隊列策略](https://github.com/firebase/firebase-work-queue),其中事件是從隊列中添加和刪除的,而不用擔心這會增加複雜性。請在下面的任何答案之前考慮這條路線 – Kato

回答

34

這是由設計,在實時系統沒有「最新」數據的概念,因爲它總是不斷變化。但是,如果你想加入到後的頁面加載列表只顯示項目,你可以做到以下幾點:

var newItems = false; 
var eventsList = new Firebase('https://*****-messages.firebaseio.com/'); 

eventsList.on('child_added', function(message) { 
    if (!newItems) return; 
    var message = message.val(); 
    $.notification(message.message); 
}); 
eventsList.once('value', function(messages) { 
    newItems = true; 
}); 
+0

它的工作!謝謝! – inlanger

+8

如果現有列表非常龐大,該怎麼辦?爲每個孩子添加的回調將被調用。這可能會導致以下問題:1.它可能會讓我的UI線程忙於處理所有回調2.在下載數據時不必要的帶寬消耗3.在片狀連接上,初始化過程可能需要很長時間4.如果我有另一個firebase引用監視更改爲其他分支,它不會收到回調,直到孩子添加操作完成這個ref ...我是否正確? – Kartik

+2

「if(!newItems)return」檢查在開始時應該是正確的,因此所有的初始數據都將被忽略,並且應該相當快。如果您實際上不想下載數據,則最好使用限制/查詢將數據量限制爲您想要的數量。 – Anant

5

我會在上面發表評論,但由於名聲,我不能,所以希望這是足夠的,這是爲了解決Gruff McGruff最後的評論。

一旦發生火災之後,因爲你想擺脫抓住所有子項目的循環。一旦這個循環被破壞,你將設置newItems變量爲true,然後它將能夠獲得所有新的孩子。

如果您之前解僱了它,它會擊敗目的並抓取所有子項目,因爲您將立即設置newItems變量。

另外,我用這個辦法,效果很好。