为什么所有coffeescript文件总是一次执行Rails

时间:2017-08-28 15:46:39

标签: javascript ruby-on-rails ruby coffeescript

我已经进入资产文件夹,每个模型都有不同的coffeescript文件。但是每次访问页面时都会执行它们,即使它来自不同的控制器。如果我继续/插入/新我希望只执行insertion.coffee,而不是所有的.coffee启动。我怎样才能一次推出一个?

这是我的insertions.coffee

$(document).on "turbolinks:load", ->
  if ($('#insertion_book_search'))
    console.log("found")
  console.log($('#insertion_book_search').length)
  console.log($('#insertion_book_title').length)
  $('#insertion_books_subject').parent().hide()

那是我的static_pages.coffee

$(document).on "turbolinks:load", ->
  console.log("Mie cose")
  $('.last_img').on 'load', ->
    natHeight = $(this).get(0).naturalHeight
    natWidth = $(this).get(0).naturalWidth
    if (natWidth > natHeight)
      $(this).css( 'width','100%')
    else
      $(this).css( 'height','100%')

我想要实现的是,当我使用插入控制器时,它只加载inserted.coffee,当我使用静态页面控制器时,它只加载static_pages 。咖啡。 根据我的理解,当我将// require_tree .行添加到/app/assets/javascript/application.js时,我的所有咖啡都被加载到我的所有视图中。

如果我删除了需求树,我尝试使用<%= javascript_include_tag ..%>添加它们。我需要一个.js文件而不是咖啡。可以加载咖啡文件吗?

3 个答案:

答案 0 :(得分:3)

您可以使用coffeescript OOP方法进行选择,下面是您需求的详细信息和一些代码

  • 我建议您使用类方法咖啡,然后使用事件turbolinks检查每个页面:load
  • 您可以查看名称为的页面 控制器和方法例如$(“。purchase_requests.new”)[0]意味着控制器是purchase_requests和方法new
  • 我建议您阅读brandon hilkert博客,以获取以下一些额外参考:the link

示例coffeescript并检查每页加载

class App.PurchaseRequest

  renderYourJavascript: ->
    console.log "purchase request js"

$(document).on "turbolinks:load", ->
  if $(".purchase_requests.new")[0] || $(".purchase_requests.edit")[0]  
    purchase_request = new App.PurchaseRequest
    purchase_request.renderYourJavascript() 

从上面的代码中可以看出,你可以通过检查$(“。controllers.action”)来分割[0]

答案 1 :(得分:1)

您应该阅读有关Rails asset pipeline的更多信息。您的所有脚本都已执行,因为您的//= require_tree .清单文件中很可能有application.js directive

如果要为操作手动指定JS文件,则应重新组织清单(至少从中删除//= require_tree .),然后可以使用javascript_include_tag手动包含JS。更多信息here

注意:如果手动包含文件,而不在清单中提及它们,则还应将Rails.application.config.assets.precompile += %w( path/to/file )添加到config/initializers/assets.rb以进行预编译。否则,您将获得一个异常,告诉您这样做。更多内容here

  

如果我删除了需求树,我尝试使用<%= javascript_include_tag ..%>添加它们。我需要一个.js文件而不是咖啡。可以加载咖啡文件吗?

无论如何,您的coffeescript文件正在预编译到JS。您只需指定不带扩展名的文件名。

答案 2 :(得分:0)

您可以在类中封装Coffeescript逻辑,然后在您实际需要调用逻辑的视图中初始化类。

所以你的咖啡文件看起来像这样:

class YourClass

   constructor: () ->
     # Anything here will be called when this object is instantiated
     @firstMethod()
     @secondMethod()

  firstMethod: () ->
    $('#some-element').click () ->
      alert('hello world')

  secondMethod: () ->
    console.log('second method triggered!')


window.YourClass = YourClass

然后,只要您在特定视图中需要此逻辑,您实际上只需初始化此对象:

<script>
  var yourClass = new YourClass();
</script>

您甚至可以通过将它们移出构造函数方法并在视图中显式调用它们来调用特定方法:

<script>
  var yourClass = new YourClass();
  yourClass.methodNotInConstructor();
</script>