Rails ActionCable/Turbolinks聊天问题:发布重复消息
问题描述:
我遇到ActionCable和Turbolinks的问题。我已经创建了一个类似于example chat app shared by DHH的聊天应用程序。Rails ActionCable/Turbolinks聊天问题:发布重复消息
为了有多个聊天室,并通过聊天室ID的ActionCable订阅初始化,我有这样的事情:
$(document).on("turbolinks:load",function(){
var pod_slug = $("#pod_slug_value").val();
App.pods = App.cable.subscriptions.create(
{ channel: 'PodsChannel', pod_slug: pod_slug },
{
received: function(data) {
if ($(".chat-stream").length){
$(data.message).appendTo($(".chat-stream"));
$(".chat-stream").scrollTop($(".chat-stream")[0].scrollHeight);
}
},
speak: function(message, pod_slug) {
return this.perform('speak',{
message: message,
pod_slug: pod_slug
});
}
});
// captures text input from input field
captureMessage();
});
然而,当我点击周围的应用程序,并回到页面,Turbolinks似乎多次绑定订阅处理程序,现在当我提交消息时,聊天流中会出现重复消息。
我试过在每一个方式切片这个问题。我没有问题,当我不前言与订阅处理程序:
$(document).on("turbolinks:load",function(){...
但后来,我无法获得聊天室ID(pod_slug),因为该文档DOM之前没有负载JavaScript执行。
看起来这个问题会有一个简单的解决方案,因为ActionCable和Turbolink都受到Basecamp的大力支持。许多demo chat tutorials建议以这种方式设置聊天。我在这里错过了什么吗?
答
您可以使用App.cable.subscriptions.remove
删除由App.cable.subscriptions.create
返回的订阅。因此,可能检查是否设置了App.pods
,如果是这样,请在再次订阅之前将其删除。
答
我有同样的问题,并以这种方式
if (!App.pods) {
App.pods = App.cable.subscriptions.create(
{ channel: 'PodsChannel', pod_slug: pod_slug },
{ ... /* and so on */ }
}
重新加载页面,每次修好了“turbolinks:加载”事件的作品,所以你必须检查App.pods对象是否已被创建。
希望这会帮助你。
答
我喜欢你的方法,MaruniakS。挖掘消费者对象,看起来它有一个测试,看看它是否断开连接。改变只是第一线,我们也可以这样做:
if (!App.pods || App.pods.consumer.connection.disconnected) {
App.pods = App.cable.subscriptions.create(
{ channel: 'PodsChannel', pod_slug: pod_slug },
{ ... /* and so on */ }
}
但不app.pods包含所有不同聊天室的参考?因此,检查它是否存在会阻止您在创建一个房间后启动新房间。没有? – Lorenz
@洛伦兹是的,你是对的。就我而言,我只需要一个通道,所以这个解决方案对我来说很合适。但是现在我对这个问题很感兴趣,所以我会试着找出我可以如何帮助你。 – MaruniakS
我做了类似的事情来暂时解决我的问题: 'if(!App.pods || JSON.parse(App.pods.identifier).pod_slug!= pod_slug){' '但它感觉非常黑客。 – Lorenz