【发布时间】:2016-09-16 23:12:37
【问题描述】:
我遇到了 ActionCable 和 Turbolinks 的问题。我设置了一个类似于example chat app shared by 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();
});
但是,当我在应用程序周围单击并返回页面时,Turbolinks 似乎多次绑定订阅处理程序,现在当我提交消息时,我在聊天流中收到重复消息。
我尝试过以各种方式解决这个问题。当我没有在订阅处理程序前面加上以下内容时,我没有问题:
$(document).on("turbolinks:load",function(){...
但是我无法获取聊天室 ID (pod_slug),因为在 javascript 执行之前文档 DOM 没有加载。
看起来这个问题有一个简单的解决方案,因为 ActionCable 和 Turbolinks 都受到 Basecamp 的大力支持。许多demo chat tutorials 建议以这种方式设置聊天。我在这里遗漏了什么吗?
【问题讨论】:
标签: javascript ruby-on-rails chat turbolinks actioncable