在Rails视图中触发Coffeescript函数

use*_*808 2 haml coffeescript ruby-on-rails-3

在某些Rails视图中,我们具有javascript函数,这些函数可以异步加载某些数据以填充页面。我们的application.js文件将所有JavaScript加载到asset / javascripts文件夹中。

这是我们的haml视图之一:

:javascript
  $(function() {
    fetch_all_facebook_invitees();
  });
Run Code Online (Sandbox Code Playgroud)

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

//= require jquery
//= require jquery_ujs
//= require jquery-ui
//= require_tree .
Run Code Online (Sandbox Code Playgroud)

加载页面的JavaScript的最佳做法是什么?仅选择性地这样做而不加载整个树?

zee*_*raw 5

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

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

确保在加载DOM时触发文件中的所有事件

$ ->
  # do Facebook stuff
Run Code Online (Sandbox Code Playgroud)

facebook.haml:

= javascript_include_tag "inline/facebook_invites"


然后还有我用来制作控制器/查看特定Coffee文件的方法:

application.html.haml:

%body{ :data => { :controller => params[:controller], :action => params[:action]} }
Run Code Online (Sandbox Code Playgroud)

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"
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)