当我通过“link_to”链接访问我的页面时,为什么我的咖啡脚本功能没有定义?

时间:2016-08-03 21:56:06

标签: jquery ruby-on-rails function coffeescript onload

我正在使用 Rails 4.2.7 。在特定页面(/ users / edit)上,我有这个链接

<%= link_to "Cancel", {:controller => :my_objects, :action => 'index' }, :class => 'btn' %>

当我点击链接时,我被带到了正确的页面,其中我有一个应该执行的咖啡脚本。它包含这个

$ ->
  #("#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');

奇怪的是,当我点击上面的链接时,我在页面上得到了JS错误

my_objects.self-50d1edb….js?body=1:16 Uncaught TypeError: setup_save_behavior is not a function

即使执行了console.log(我可以看到“调用函数加载。”打印出来)。如果我实际进入我的网址的地址栏,然后输入我的网址“http://loclahost:3000/my_objects/index”,那么一切正常,并且没有Javascript错误。我完全不知所措。当我点击“link_to”脚本定义的链接时,我能做什么才能定义我的函数?

1 个答案:

答案 0 :(得分:0)

Turbolinks可能会导致Rails应用程序出现问题,因为它会尝试通过维护页面<head>元素中列出的资源(以及其他内容)来节省开销。使用完全加载(通过刷新按钮)加载页面时,会发生实际的ready事件,并且您的脚本可以正常工作。另一方面,如果您以其他方式(通过链接)访问页面,Turbolinks会尝试重用<head>元素,因此没有触发ready事件。

过去的解决方案是通过删除require中的application.js行或链接(data: {no_turbolink: true})来完全禁用Turbolinks。使用Rails 4.2.x和5.x,您可以收听Turbolinks相关事件,该事件应该适用于之前正常ready事件。{/ p>

来自documentation

  

但是,由于Turbolinks会覆盖正常的页面加载过程,   这种依赖的事件不会被解雇。如果你有代码   看起来像这样

$(document).ready ->
  alert "page has loaded!"
  

您必须更改代码才能执行此操作:

$(document).on "turbolinks:load", ->
  alert "page has loaded!"

(为清晰起见,引用稍微重新排列)