Каков наилучший способ селективного запуска JavaScript при использовании конвейера ресурсов rails? - PullRequest
2 голосов
/ 06 декабря 2011

У конвейера ресурсов рельсов есть свои проблемы, но преимущества от конкатенации всего моего JS, его минимизации и обслуживания заголовками с истекшим сроком давности трудно игнорировать.

Множество JS в моем приложении rails относятся к одному действию. Например, у нас есть сложная страница для сотрудников, чтобы вводить заказы клиентов.

pre rails 3.1, у меня был специальный код действия в отдельном файле JS, который загружался только при необходимости. Теперь все мои JS обслуживаются все время. Как лучше всего запускать JS для ввода заказа только тогда, когда это необходимо?

В настоящее время я проверяю элементы DOM для ввода заказа, но это означает, что в DOMready будет много ненужных функций.

Вот фрагмент кода coffeespcript из кода ввода заказа, и этот шаблон повторяется примерно в 20 файлах. Есть ли лучший способ?

$ ->
  window.app.draft = new app.DraftOrder()

@module 'app', ->
  class @DraftOrder
    constructor: ->
      @items = $('table.draft-items tr')
      return if @items.size() == 0
      @initEvents()
      @move_first()
    initEvents: ->
      # foo
    otherMethod: ->
      # bar

Ответы [ 2 ]

2 голосов
/ 19 апреля 2012

Мне нравится оборачивать свой JS для конкретной страницы в замыкание и вставлять в шаблон моего приложения код, который позволяет мне выборочно выполнять его.

поэтому мои js для конкретной страницы для контроллера «Events» могутвыглядят как:

events = {
  onload: function() {
    // put any page-specific onload code here
  },
  someOtherRoutine: function() {
  }
}

в моем шаблоне приложения (application.html.erb), я добавляю:

<%= javascript_tag do %>
  window.controller_name = <%= params[:controller] %>;
  window.action_name = <%= params[:action] %>;
<% end%>

затем в application.js (если вы используете jQuery):

$(function() {
  if(controller_name === 'events'){
    events.onload();
  }
  else if(controller_name === 'anothercontroller'){
    anothercontroller.onload();
  }

  // put any global onload functionality here...
});

Это имеет дополнительное преимущество, заключающееся в том, чтобы дать своего рода JS-пространство своего рода псевдониму для всех страниц, специфичных для вашей страницы.

Вероятно, существует более идиоматический способ rails / javascript;Я не программист JS, но я учусь любить язык немного ...

0 голосов
/ 06 декабря 2011

Это включает все ваши файлы javascript только потому, что у вас есть эта строка в вашем application.js файле:

//= require_tree .

Если вы удалите это, оно будет включать только те файлы, которые вам конкретно необходимы.Если вы укажете имя папки (а не .), то у вас может быть место, куда вы помещаете файлы, которые вы хотите «включить автоматически».Подробнее об этом вы можете прочитать в Rails Guides .Например, ваш файл application.js может выглядеть следующим образом:

//= require jquery_ujs
//= require main

Тогда у вас может быть файл order_entry.js, в котором есть только нужный код.Конечно, вы ссылаетесь на них так же, как раньше:

Для application.js:

<%= javascript_include_tag "application" %>

Для вашего нового order_entry.js:

<%= javascript_include_tag "order_entry" %>
...