2017-08-28 49 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>