2016-12-14 43 views
1

在我的应用中,我有一个聊天客户端。左侧div有对话列表,右侧div标记为#message-content。当用户点击对话时,它会添加一个监听器,并在消息内容部分生成对话。当他们点击左边的div中的另一个对话时,右边的div被擦除,并且与监听者一起产生新的消息。使用Firebase单击多个会话时无法禁用侦听器

问题是,它似乎支持听众,所以如果我查看多个对话,然后收到一条消息,它会生成n条消息,其中n是我点击的对话数量。

我假设我需要从前一个对话中分离出听众,但我无法弄清楚如何。

下面是我打电话,当用户单击左侧的锂元素的功能,它会清除#message-content,并运行:

var displayMessagesDetail = function (uid, chatID) { 
    usersRef.child(`${uid}/chats/${chatID}/messages`).on('child_added', function(snapshot) { 

     let message = snapshot.val(); 
     let userClass = (message.user === auth.currentUser.uid ? 
      'message-bubble-self' : 
      'message-bubble-other' 
     ); 

     $('#message-detail-content').append($('<p></p>').addClass(userClass).text(message.text)); 

    }); 
}; 

回答

2

运行displayMessagesDetail每次的.on()方法创建另一个监听器。聊天开始时,您只应该运行一次该功能。

或者,您可以在单击另一个聊天时停用监听器。您可以拨打usersRef.child(${uid}/chats/${chatID}/messages)拨打电话.off(),其中chatIDuid与您远离的聊天内容匹配。这将停止收听来自该聊天的任何更新。

+0

尽管只有一个监听器,我该怎么做?有没有办法与那个听众说话,并改变路径?因为我想我可以让一个侦听器存在,并且如果用户点击另一个聊天div,它会改变侦听器路径,并让它加载正确的消息。 – VDog

+0

如果您只想一次只有一个活跃的听众,我相当确信您必须关闭旧的聊天室,并在每次切换聊天时创建一个新的聊天室。我不认为你可以修改活动的侦听器。尝试将活动聊天uid和chatID保存为变量,并且每次切换到新聊天时,都可以在活动聊天中调用'.off()'。然后创建一个新的监听器并更新您的活动聊天变量 – Shane

+0

好啊,非常感谢。是的,我现在通过点击一条新消息关闭了听众,所有人都按照应有的方式工作。谢谢! – VDog

相关问题