如何使用turbolinks在Rails4上启用`sorttable.js`

  • Rails 4.2.0,turbolinks(2.5.3)
  • jquery-rails(4.0.3),jquery-ui-rails(5.0.3)
  • sorttable.js
  • 适用于Chrome,Firefox和IE的应用

应该发生什么 :无论是重定向,渲染还是只是单击应用程序中的新页面,任何具有类可排序表的表(我在原始JS中编辑它)都应该按列标题排序。

实际发生的事情 :我在联系页面上。 我点击刷新,JS中的记录器语句出现了。 该插件按预期工作。 如果我导航到Home,然后返回到Contacts,该文件仍然列在页面源中,但不显示任何记录器语句。 该插件不起作用。

我们的application.js读取如下:

 //= require jquery //= require jquery_ujs //= require jquery-ui //= require jquery_nested_form //= require bootstrap //= require sorttable //= require_directory . //= require autocomplete-rails //= require turbolinks //= require bootstrap-switch 

每页或完全禁用Turbolink对我们来说不是一个解决方案。 如果文件不能与turbolinks一起使用,我愿意使用gem; 但是,gem应该为应用程序添加一些代码。 我们宁愿没有专门用于选择要排序的列的类。 此外,一些待排序的列不是来自ActiveRecord(如1个单元格中的2个属性)。

经过大量调试后,我弄清楚为什么turbolinks不喜欢sorttable.js 。 JS文件包含触发器(一些基于浏览器类型)以在文档加载时启动sorttable。 这样的事件监听器与turbolinks不兼容。 我做了这项工作的目的如下。

  1. vendor/assets/javascripts/sorttable.js移至app/views/shared/js/_sorttable.html.haml

  2. 使用以下命令对新文件进行前缀:javascript%script{languauge: "javascript"} ),并缩进所有后续行2个空格

  3. application.js删除sorttable

  4. 在所有相关页面的顶部,添加以下代码块:

     = render 'shared/js/sorttable' %script $(document).on("page:change", sorttable.init) 

有关代码示例和进一步说明,请参阅此要点 。