Запуск функций Coffeescript в представлении Rails - PullRequest
2 голосов
/ 28 ноября 2011

В некоторых наших представлениях Rails у нас есть функции JavaScript, которые загружают определенные данные асинхронно для заполнения страницы.Наш файл application.js загружает весь javascript в папку assets / javascripts.

Вот фрагмент, который содержится в одном из наших представлений haml:

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

Если мы поместим определение функции fetch_all_facebook_invitees вфайл coffeescript, он загружается на каждую страницу, потому что они включены во все страницы приложения:

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

Как лучше всего загружать JavaScript для страницы?Только делать это выборочно и не загружать все дерево?

1 Ответ

5 голосов
/ 14 февраля 2012

Вы можете решить эту проблему с помощью «частичных» файлов кофе, которые вы отображаете встроенными.

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