1

私のアプリではチャットクライアントがあります。左側のdivには会話のリストがあり、右側のdivには#message-contentというラベルが付きます。ユーザーが会話をクリックすると、リスナーが追加され、メッセージコンテンツセクションに会話が生成されます。左のdivの別の会話をクリックすると、右のdivが消去され、リスナーで新しいメッセージが生成されます。Firebaseで複数の会話がクリックされたときにリスナーを無効にできません

問題は、リスナーを保持しているように見えるので、複数の会話を表示してメッセージを受信すると、n個のメッセージが生成されます.nは、クリックした会話の量です。

前の会話からリスナーを切り離す必要があると仮定しますが、どのように把握できません。

は、ここで私は、ユーザが左手側のli要素をクリックしたとき、それは#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()方法は別のものを作成し、リスナー。チャットが開始されたときにのみ、その機能を一度実行する必要があります。

また、別のチャットをクリックしたときにリスナーを無効にすることもできます。 .off()usersRef.child(${uid}/chats/${chatID}/messages)に、とuidは、離れた場所から移動したチャットと一致します。それはそのチャットからの更新情報の受信を停止します。

+0

どうすればいいですか?その聞き手と話し、その道を変える方法はありますか?その1つのリスナーが存在すると思うので、ユーザーが別のチャットdivをクリックすると、リスナーのパスが変更され、正しいメッセージがロードされます。 – VDog

+0

一度にアクティブなリスナーを1つだけにしたい場合、チャットを切り替えるたびに古いものをオフにして新しいものを作成する必要があります。私はあなたがアクティブなリスナーを変更できるとは思わない。アクティブチャットuidとchatIDを変数として保存してみてください。新しいチャットに切り替えるたびに、アクティブチャットで '.off()'を呼び出すことができます。その後、新しいリスナーを作成し、アクティブなチャット変数を更新してください。 – Shane

+0

ああ、ありがとうございます。そうですね、私は新しいメッセージのクリックでリスナーを止めました。ありがとう! – VDog

関連する問題