2013-09-26 28 views
2

我正在使用Firebase開發HTML5移動消息應用程序。我遇到了一個我無法解決的問題。該應用程序有多個頻道(聊天室)。當第一次向某個頻道添加消息時,它會按預期工作,但當我轉到其他頻道並向該頻道發佈新消息時,我會返回到上一個頻道併發布另一條消息,我會得到上次發佈的副本信息。當我重新加載頁面時,重複項已不存在,但我寧願不顯示重複項。下面是我的代碼:Firebase child_added創建重複項目

function loadChatMessages(channelID) { 
    $('#chatMessages').html(''); 
    var msgObj = {}; 
    var channelRef = globals.channelsBase + '/' + channelID + '/messages'; 

    var channelMessages = new Firebase(channelRef); 
    channelMessages.on('child_added', function (snapshot) { 
     msgObj = snapshot.val(); 
     var id = snapshot.name().toString(); 

      var messageTime = application.Functions.renderTime(msgObj.messageTime); 
      var tails = '<div class="message-tails-wrap"><div class="message-tails"></div></div>'; 
      var html = '<li class="chatEl ' + sentByClass + '" id="'+id+'">'; 
      html += tails; 
      html += msgObj.message; 
      html += '<span class="sender"> ' + by + ' </span> <span class="tmp-recipient"> ' + msgObj.recipient + ' </span>'; 
      html += '<span class="time-stamp msg-time" >'; 
      html += messageTime; 
      html += '</span></li>'; 
      $(html).appendTo('#chatMessages'); 

     /// TODO: TEMP solution! 
     var prevID = 0; 
     $('#chatMessages li').each(function(n) { 
      var id = $(this).attr('id'); 
      if(id == prevID){ 
       // console.log(id + ' is a duplicate. Remove it'); 
       this.remove(); // the necessary evil....     
      } 
      prevID = id; 
     }); 

    }); 

} 
+0

我會設置一個斷點或添加一個console.log以確保您的.on('child_added',...)調用不會多次運行。 –

+0

感謝您的建議。我已經嘗試過了。 on('child_added,...)在通道首次加載時被多次調用,然後一次添加新消息。這是預料之中的。當我將消息添加到不同的頻道然後加載我的上一個頻道時,問題就開始了。然後,當我在('child_added,...)上添加新消息被調用兩次。 – thmr

+0

是的,那是因爲.on(「child_added」)被調用兩次。在爲新頻道添加新監聽器之前,您需要確保調用.off(「child_added」)。 – Anant

回答

3

這聽起來像您運行loadChatMessages()每次進入房間的時候,和你的用戶走動的房間,你看到你的on('child_added'回調重複呼叫。

這是因爲您每次重新進入房間時都會添加新的回調。要解決這個問題,請在用戶離開房間時進行一些清理。在清理功能中,請確保使用.off("child_added")刪除舊聽衆。

1

事件:

YOURREF.limitToLast(1).on('child_added', function (OBJECTADDED){ 
    console.log(OBJECTADDED.key(), OBJECTADDED.val()); 
}); 

你可能會認爲上面的代碼將Ë發射一次,這是不正確的。上面的console.log會被觸發兩次,一次是在引用YOURREF中的OBJECTADDED作爲最後一個對象之前添加新的,另一個是新的。