Rails版本5.1.3
具体来说,它是assets/javascripts/channels/my_channel.coffee
中通道js客户端代码所在的代码,以及其他通用的js代码。我正在使用actioncable。但是一般的jQuery / javascript回调也受此影响。在javascript中重写jQuery append
并没有什么不同。
所有回调都会被触发两次。换句话说,触发回调后要执行的功能被调用两次,包括频道订阅和$(document).ready
。具体来说,如果我把
$(some_id_name).append some_string
在$(document).ready
中的事件函数中,它将被追加两次。我也将actioncable频道订阅实例视为回调。用户通过发送消息来触发实例来调用receive
方法。所以该方法中的代码也执行了两次。 append
就我而言。
可能是整个js文件被加载两次。但是如何?
这只发生在测试和生产环境(Heroku)中,而不是在开发环境中。意味着什么?
我通过在线搜索找到的turbolinks
分为3个步骤。在jquery
中仅包括rails-ujs
和jquery_ujs
一次,不包括application.js
。不存在public/assets
。
my_channel.coffee
的一部分如下所示。所有自定义函数都包含多个回调,例如click
,keydown
。如果我对他们使用unbind
和bind
,它将解决问题。但我无法将其应用于$(document).ready
和频道订阅实例。
$(document).ready ->
$('#messages').append "document is ready"
submitQuestion()
submitAnswer()
hideJudgeForm()
return
在application.js
//= require jquery
//= require rails-ujs
//= require bootstrap
//= require spin.js/spin
//= require_tree .
答案 0 :(得分:2)
嗯,我要做的第一件事就是检查我没有任何其他文件,包括文件my_channel.coffee
。既不是另一个包的一部分,也不是javascript_include_tag
。
之后,我会尝试删除所有文件中的require_tree .
,并将其替换为我希望Rails作为捆绑包的一部分加载的特定文件列表。由于这个原因,您可能有两个不同的文件间接导入my_channel.coffee
。