当我通过 "link_to" link 访问我的页面时,为什么我的咖啡脚本函数没有定义?
Why isn't my coffee script function defined when I visit my page via a "link_to" link?
我正在使用 Rails 4.2.7。在特定页面 (/users/edit) 上,我有这个 link
<%= link_to "Cancel", {:controller => :my_objects, :action => 'index' }, :class => 'btn' %>
当我点击 link 时,我被带到了正确的页面,其中我有一个应该执行的咖啡脚本。它包含这个
$ ->
#("#add_form).click ->
console.log(" invoking function load. ")
setup_save_behavior()
…
setup_save_behavior = () ->
$("a.modal_button").unbind('click')
$("a.modal_button").click ->
# Setup action
$('#new_my_object').attr('action', '/my_objects/create')
$('#_method').val('')
# Clear existing error messages
clear_form_errors()
# Clear existing form elements
$(':input[name^=my_object]','#new_my_object')
.not(':button, :submit, :reset')
.val('')
.removeAttr('checked')
.removeAttr('selected');
奇怪的是,当我点击上面我的link时,页面出现JS错误
my_objects.self-50d1edb….js?body=1:16 Uncaught TypeError: setup_save_behavior is not a function
即使 console.log 已执行(我可以看到“正在调用函数加载。”打印出来)。如果我真的进入 URL 的地址栏,然后键入我的 URL、“http://loclahost:3000/my_objects/index”,那么一切都会正常加载并且没有 Javascript 错误。我完全不知所措。当我单击“link_to”脚本定义的 link 时,我该怎么做才能定义我的函数?
Turbolinks 可能会导致您的 Rails 应用程序出现问题,因为它试图通过维护页面的 <head>
元素中列出的资产(以及其他内容)来节省开销。当您使用完全加载(通过刷新按钮)加载页面时,实际的 ready
事件发生并且您的脚本工作。另一方面,如果您以其他方式访问页面(通过 link),Turbolinks 会尝试重用 <head>
元素,因此没有 ready
事件被触发。
过去的解决方案是完全禁用 Turbolinks,方法是删除 application.js
中的 require
行或 link(data: {no_turbolink: true}
).使用 Rails 4.2.x 和 5.x,您可以侦听 Turbolinks 相关事件,该事件应该在正常 ready
事件之前起作用的地方起作用.
However, because Turbolinks overrides the normal page loading process,
the event that this relies on will not be fired. If you have code that
looks like this
$(document).ready ->
alert "page has loaded!"
you must change your code to do this instead:
$(document).on "turbolinks:load", ->
alert "page has loaded!"
(为清晰起见略微重新排列了引文)
我正在使用 Rails 4.2.7。在特定页面 (/users/edit) 上,我有这个 link
<%= link_to "Cancel", {:controller => :my_objects, :action => 'index' }, :class => 'btn' %>
当我点击 link 时,我被带到了正确的页面,其中我有一个应该执行的咖啡脚本。它包含这个
$ ->
#("#add_form).click ->
console.log(" invoking function load. ")
setup_save_behavior()
…
setup_save_behavior = () ->
$("a.modal_button").unbind('click')
$("a.modal_button").click ->
# Setup action
$('#new_my_object').attr('action', '/my_objects/create')
$('#_method').val('')
# Clear existing error messages
clear_form_errors()
# Clear existing form elements
$(':input[name^=my_object]','#new_my_object')
.not(':button, :submit, :reset')
.val('')
.removeAttr('checked')
.removeAttr('selected');
奇怪的是,当我点击上面我的link时,页面出现JS错误
my_objects.self-50d1edb….js?body=1:16 Uncaught TypeError: setup_save_behavior is not a function
即使 console.log 已执行(我可以看到“正在调用函数加载。”打印出来)。如果我真的进入 URL 的地址栏,然后键入我的 URL、“http://loclahost:3000/my_objects/index”,那么一切都会正常加载并且没有 Javascript 错误。我完全不知所措。当我单击“link_to”脚本定义的 link 时,我该怎么做才能定义我的函数?
Turbolinks 可能会导致您的 Rails 应用程序出现问题,因为它试图通过维护页面的 <head>
元素中列出的资产(以及其他内容)来节省开销。当您使用完全加载(通过刷新按钮)加载页面时,实际的 ready
事件发生并且您的脚本工作。另一方面,如果您以其他方式访问页面(通过 link),Turbolinks 会尝试重用 <head>
元素,因此没有 ready
事件被触发。
过去的解决方案是完全禁用 Turbolinks,方法是删除 application.js
中的 require
行或 link(data: {no_turbolink: true}
).使用 Rails 4.2.x 和 5.x,您可以侦听 Turbolinks 相关事件,该事件应该在正常 ready
事件之前起作用的地方起作用.
However, because Turbolinks overrides the normal page loading process, the event that this relies on will not be fired. If you have code that looks like this
$(document).ready ->
alert "page has loaded!"
you must change your code to do this instead:
$(document).on "turbolinks:load", ->
alert "page has loaded!"
(为清晰起见略微重新排列了引文)