在Rails视图中触发Coffeescript函数

时间:2011-11-27 20:22:57

标签: ruby-on-rails-3 coffeescript haml

在我们的一些Rails视图中,我们有javascript函数,它们异步加载某些数据来填充页面。我们的application.js文件加载assets / javascripts文件夹中的所有javascript。

以下是我们的一个haml视图中的一点:

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

如果我们将fetch_all_facebook_invitees函数定义放在coffeescript文件中,它会在每个页面上加载,因为它们包含在应用程序的所有页面中:

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

为页面加载javascript的最佳做法是什么?只选择性地执行它而不加载整个树?

1 个答案:

答案 0 :(得分:5)

您可以通过内联呈现“部分”咖啡文件来解决此问题。

../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