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

Rog*_*ara 10 coffeescript turbolinks ruby-on-rails-4

起初,所有javascript都运行良好.

但是,从我导航到另一个页面的那一刻起,任何事件都会被多次触发.如果我刷新页面,一切都恢复正常.

在jquery.turbolink文档中,有一个关于在$(function())块中绑定文档事件的警报.但是,默认情况下,coffescript似乎就像这样.所以我该怎么做?

这是我的环境:

的Gemfile:

gem 'turbolinks'
gem 'jquery-turbolinks'
Run Code Online (Sandbox Code Playgroud)

的application.js

//= require jquery
//= require jquery.turbolinks
//..app js
//= require turbolinks
Run Code Online (Sandbox Code Playgroud)

application.html.erb

<html>
  <head>
    <meta charset="utf-8">
    <title><%= t 'brand' %> </title>
    <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %>
    <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
    <%= yield :head %>
    <%= csrf_meta_tags %>
    <meta name="description" content="<%= yield :page_description %>">
    <meta name="keywords" content="<%= yield :page_keywords %>">
  </head>
Run Code Online (Sandbox Code Playgroud)

controller.js.coffee

$(document).ready ->    
  $(document).on 'click', '.addition .label i', (e) ->
    console.log ".addition .label i 'click' fired!"
Run Code Online (Sandbox Code Playgroud)

问题是,显然coffeescript IS生成的javascript文件默认位于一个块内.看看这个:

controller.js(由coffeescript生成)

function() {
  $(document).ready(function() {
    $(document).on('click', '.addition .label i', function(e) {
      console.log(".addition .label i 'click' fired!");
    });
...
Run Code Online (Sandbox Code Playgroud)

那么,我该怎么做才能正确使用coffeescript + JQuery Turbolinks?我应该进行不同的配置吗?

干杯.

Bri*_*rty 11

问题出在controller.js.coffee中.

你写了这个:

$(document).ready ->    
  $(document).on 'click', '.addition .label i', (e) ->
    console.log ".addition .label i 'click' fired!"
Run Code Online (Sandbox Code Playgroud)

但因为你是使用jQuery Turbolinks,你需要移动的事件处理程序之外的$(document).ready函数:

$(document).ready ->
  # Other code can go here, but not binding event handlers
$(document).on 'click', '.addition .label i', (e) ->
  console.log ".addition .label i 'click' fired!"
Run Code Online (Sandbox Code Playgroud)

看一下jQuery Turbolinks README.它提到了这个问题和解决方案.(在自述文件中搜索"两次或更多次触发的事件.")