我有一个问题与ActionCable和turbollinks。我已经建立了一个聊天应用程序类似的例子聊天应用程序由DHH共享。
为了拥有多个聊天室并将聊天室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();
});
然而,当我点击应用程序周围并返回页面时,turbollinks似乎多次绑定订阅处理程序,现在当我提交消息时,我在聊天流中得到重复的消息。
我试过用各种方法来划分这个问题。当我不以:
作为订阅处理程序的开头时,我没有遇到这个问题。$(document).on("turbolinks:load",function(){...
但是我无法获得聊天室id (pod_slug),因为文档DOM在javascript执行之前没有加载。
这个问题似乎有一个简单的解决方案,因为ActionCable和turbolink都是由Basecamp大力支持的。许多演示聊天教程建议以这种方式设置聊天。我遗漏了什么吗?
我有同样的问题,并以这种方式修复它
if (!App.pods) {
App.pods = App.cable.subscriptions.create(
{ channel: 'PodsChannel', pod_slug: pod_slug },
{ ... /* and so on */ }
}
每次你重新加载页面,' turbollinks:load'事件工作,所以你必须检查App.pods对象是否已经创建。
可以使用App.cable.subscriptions.remove
删除由App.cable.subscriptions.create
返回的订阅。所以检查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 */ }
}