多个订阅的操作电缆通知

时间:2016-10-14 20:06:36

标签: javascript ruby-on-rails actioncable

我试图通过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参数

通道/ 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中收到的函数?

1 个答案:

答案 0 :(得分:0)

当我访问其他页面时,事实证明Ajax请求正在创建每个请求的两倍。我通过添加

来修复它
if (App['chat' + chat.id] == undefined){...

在创建订阅之前。这样,只有当订阅尚不存在时才会创建订阅。