我试图通过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中收到的函数?
答案 0 :(得分:0)
当我访问其他页面时,事实证明Ajax请求正在创建每个请求的两倍。我通过添加
来修复它if (App['chat' + chat.id] == undefined){...
在创建订阅之前。这样,只有当订阅尚不存在时才会创建订阅。