2017-08-28 19 views
2

我已经在资产文件夹中为每个模型提供了不同的咖啡文件文件。但是,每次访问页面时都会执行它们,即使它来自不同的控制器。如果我继续/插入/新的,我希望只执行insertion.coffee,而不是所有的.coffee启动。我怎样才能一次启动一个?为什么所有咖啡脚本文件总是一次全部执行Rails

这是我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%') 

我想什么才达到的是,当我使用插入控制器,它仅加载insertion.coffee,当我使用静态页面控制器时,它只加载static_pages.coffee。 据我所知,当我将// require_tree .行添加到/app/assets/javascript/application.js时,我的所有视图中都装载了所有的咖啡。

如果我删除了需要的树,我尝试用<%= javascript_include_tag ..%>添加它们。我需要有.js文件而不是咖啡。有可能加载咖啡文件?

+0

发布您的coffeescript资产的两个单独示例。我敢打赌,你将他们绑定到同一个事件,这就是为什么他们都跑。请记住,您可以将coffeescript/js放在不同的文件中,但它们都被编译为一个单独的文件。不同的文件名将帮助您组织脚本 - 它们不是名称空间。 – MarsAtomic

回答

3

可以使用CoffeeScript的OOP方法进行选择,下面是细节和您的要求

  • 一些代码,我建议你使用咖啡类的方法,然后与事件turbolinks检查每一页:负载
  • 您可以检查哪个页面的名称为 控制器,例如$(“。purchase_requests。新“)[0]这意味着控制器purchase_requests和新方法
  • 我也建议你阅读布兰登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

您应该了解更多关于Rails asset pipeline的信息。您的所有脚本都已执行,因为您的application.js清单文件中很可能有//= require_tree .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文件,而不是咖啡。有可能加载咖啡文件?

你的咖啡文件正在被预编译为JS。所有你需要的是指定没有扩展名的文件名。

0

可以封装你的CoffeeScript逻辑类,然后初始化在T类他认为你实际上需要调用这个逻辑。

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

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>