2013-09-26 3 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

중단 점을 설정하거나 .on ('child_added', ...) 호출이 여러 번 실행되지 않도록 console.log를 추가 할 수 있습니다. –

+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()); 
}); 

당신은이 사실이 아니다, 위의 코드는 한 번 발사 E 것이라고 생각 할 수있다. 위의 console.log는 OBJECTADDED를 참조 YOURREF의 마지막 객체로 사용하고 새 객체를 추가하기 전에 한 번, 새 객체를 추가하기 전에 한 번 두 번 실행됩니다.

관련 문제