rails 4 turbolinks 多个绑定

Posted

技术标签:

【中文标题】rails 4 turbolinks 多个绑定【英文标题】:rails 4 turbolinks multiple bindings 【发布时间】:2015-08-21 00:24:55 【问题描述】:

与此有类似的问题,但它们似乎都是由正文中的 javascript 标记引起的,在我的情况下,我的是在头部。我也不能将我的 js 移到页面更改块之外(我认为至少不能)

我遵循 Rails 约定,根据资源在每个文件中包含我的所有 js,并将它们包含在 application.js 中。

我的 js 在我的头部布局文件中:

<!DOCTYPE html>
<html> 
 <head>
   <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>

我的文件都遵循 Rails 文档中的建议使用页面更改事件:http://guides.rubyonrails.org/working_with_javascript_in_rails.html#turbolinks

这是一个示例 js 文件(report.js - 我使用的是咖啡脚本)

load_reports = ->
      table = $('#reports').DataTable()
      company_input_field = $('#rc-cn-st-input')
      company_input_field.on 'keyup change', ->
        table.column(2).search(@value).draw()
        return

$(document).on('page:change', load_reports)

这一切都很好,直到我使用浏览器的后退按钮。一旦我这样做,我会为每次点击触发 2 次事件。我该如何解决这个问题以及要遵循的约定是什么?

在其他情况下,我将我的 js 移到页面更改块之外并做了:

$(document).on 'click', 'td.details-control', ->
  # do something

但是在上面的例子中这似乎并不实用,我引用的 jquery 数据表只在一页上,并且只需要在我在该页上时进行设置。

我确实看过 .off() 函数,但不知道在这种情况下如何使用它,我尝试的一切似乎要么删除活动侦听器,要么失败。

【问题讨论】:

【参考方案1】:

尝试使用

$(document).on('turbolinks:load', load_reports) 

而不是

$(document).on('page:change', load_reports). 

这对我有用,它只加载了一次页面。

顺便说一下,这适用于 rails 4.2 及更高版本https://***.com/a/38457941/7252292

【讨论】:

以上是关于rails 4 turbolinks 多个绑定的主要内容,如果未能解决你的问题,请参考以下文章

Rails 4 + Turbolinks + JQuery Turbolinks + Coffeescript:事件被多次触发

带有 Rails 4.2.0 的 Fotorama jQuery Gallery(Turbolinks 问题)

带有 Turbolinks 的 Rails Bootstrap 4

除非使用 turbolinks 和 rails 4 重新加载页面,否则 javascript 不会执行

在 Rails 4 中使用 Foundation 和 Turbolinks 时遇到问题

Turbolinks 不适用于 Rails 4.2.4 Ruby 2.2.4 中的 bootstrap select2