2011-11-27 52 views
2

在我們的一些Rails視圖中,我們有JavaScript函數,它們異步加載某些數據以填充頁面。我們的application.js文件在assets/javascripts文件夾中加載所有的javascript。在Rails視圖中觸發Coffeescript函數

這裏是有點這是在我們的HAML觀點之一:

:javascript 
    $(function() { 
    fetch_all_facebook_invitees(); 
    }); 

如果我們把fetch_all_facebook_invitees函數定義在CoffeeScript的文件,它加載的每個頁面上,因爲他們列入的所有頁面應用程序:

//= require jquery 
//= require jquery_ujs 
//= require jquery-ui 
//= require_tree . 

加載JavaScript的頁面的最佳做法是什麼?只有選擇性地執行而不加載整個樹?

+1

可能重複[我應該如何在一個頁面上包含一個coffeescript文件?](http://stackoverflow.com/questions/8284117/how-should-i-include-a-coffeescript-file-on-only -一頁) –

回答

4

您可以通過內嵌渲染「部分」咖啡文件來解決此問題。

../assets/javascripts/inline/facebook_invites.js.coffee

確保文件中的所有事件,當DOM加載觸發

$ -> 
    # do Facebook stuff 

facebook.haml:

= javascript_include_tag "inline/facebook_invites"


的ñ還有還有,我使用,使控制器/查看特定的咖啡文件的方法:

application.html.haml:

%body{ :data => { :controller => params[:controller], :action => params[:action]} } 

application.js.coffee:

$(document).ready -> 
    load_javascript($("body").data('controller'),$("body").data('action')) 

load_javascript = (controller,action) -> 
    $.event.trigger "#{controller}.load" 
    $.event.trigger "#{action}_#{controller}.load" 

facebook.js.coffee

$(document).bind 'edit_facebook.load', (e,obj) => 
    # fire on edit facebook controller action 

$(document).bind 'show_facebook.load', (e,obj) => 
    # fire on show facebook controller action 

$(document).bind 'facebook.load', (e,obj) => 
    # fire on all facebook controller actions