2016-10-14 35 views
0

我正在嘗試使用Action Cable在我的Rails聊天應用程序中動態更新一個小紅色通知圈。問題是,有時在發送消息時,它似乎不止一次地觸發接收功能。我很確定我已經正確定義了訂閱,但出現了問題。多個訂閱的動作電纜通知

這裏我確保使用chat_id參數創建訂閱。相同的參數在submitNewMessage函數中使用

資產/ JavaScript的/信道/ chat.js

$(document).on('turbolinks:load', function() { 

submitNewMessage(); 

$.ajax({ 
type: "GET", 
dataType: "json", 
url: "/chats", 
success: function(data){ 
    $.each(data, function(i, chat){ 
     App['chat' + chat.id] = App.cable.subscriptions.create({ 
      channel: "ChatChannel", 
      chat_id: chat.id}, 
      { received: function(data){ 

      # Code to update notifications 
      }} 
     }); 
    } 
    } 
}); 

function submitNewMessage(){ 
     $('#message_text').keydown(function(event) { 
      if (event.keyCode == 13) { 
       var text = event.target.value 
       App['chat' + chat_id].send({text: text}) 
       $('#message_text').val(" ") 
       return false; 
      } 
     }); 
} 
}); 

而在訂閱方法我還使用chat_id PARAMS

通道/ chat_channel.rb

class ChatChannel < ApplicationCable::Channel 

    def subscribed 
     stream_from "chat_#{param['chat_id']}_channel" 
    end 

    def unsubscribed 
    # Any cleanup needed when channel is unsubscribed 
    end 

    def receive(payload) 
     Message.create(user_id: current_user.id, chat_id: params["chat_id"], text: payload["text"]) 
    end  

end 

在觸發新評論時,chat.js中的接收函數如何被觸發多次?

回答

0

原來,當我訪問其他頁面時,Ajax請求正在創建每個請求的兩倍。我通過添加

if (App['chat' + chat.id] == undefined){... 

創建訂閱之前。這樣它只會創建訂閱,如果它尚不存在。