У меня есть в папке активов различные файлы Coffeescript для каждой модели. Но все они выполняются каждый раз, когда я захожу на страницу, даже если она с другого контроллера. Если я продолжу / inserttion / new, я ожидаю, что выполняется только inserttion.coffee, вместо этого запускаются все мои .coffee. Как я могу запустить по одному?

Это мои вставки. Кофе

$(document).on "turbolinks:load", ->
  if ($('#insertion_book_search'))
    console.log("found")
  console.log($('#insertion_book_search').length)
  console.log($('#insertion_book_title').length)
  $('#insertion_books_subject').parent().hide()

Это мой static_pages.coffee

$(document).on "turbolinks:load", ->
  console.log("Mie cose")
  $('.last_img').on 'load', ->
    natHeight = $(this).get(0).naturalHeight
    natWidth = $(this).get(0).naturalWidth
    if (natWidth > natHeight)
      $(this).css( 'width','100%')
    else
      $(this).css( 'height','100%')

Чего я хотел бы добиться, так это того, что когда я использую контроллер вставки, он загружает только файл inserttion.coffee, а когда я использую контроллер статических страниц, он загружает только static_pages.coffee. Из того, что я понимаю, когда я добавляю строку // require_tree . к /app/assets/javascript/application.js, весь мой кофе загружается во все мои представления.

Если я удаляю дерево требований и пытаюсь добавить их с помощью <% = javascript_include_tag ..%>, мне нужен файл .js, а не кофе. Можно ли загрузить файлы кофе?

2
Leonardo 28 Авг 2017 в 18:46

3 ответа

Лучший ответ

Вы можете сделать выбор, используя метод OOP coffeescript, ниже приведены детали и некоторый код для вашего требования

  • Я предлагаю вам использовать кофе с методом класса, а затем проверять каждую страницу с событиями:
  • Вы можете проверить, какая страница с именем контроллера и методом, например, $ (". purchase_requests.new") [0], что означает, что контроллером является purchase_requests и метод new
  • Кроме того, я предлагаю вам прочитать блог Брэндона Хилкерта для получения дополнительной ссылки ниже: ссылка

Образец кода с проверкой загрузки каждой страницы

class App.PurchaseRequest

  renderYourJavascript: ->
    console.log "purchase request js"

$(document).on "turbolinks:load", ->
  if $(".purchase_requests.new")[0] || $(".purchase_requests.edit")[0]  
    purchase_request = new App.PurchaseRequest
    purchase_request.renderYourJavascript() 

Как вы можете видеть из моего кода выше, вы можете разделить, проверив $ (". controllers.action") [0]

3
widjajayd 28 Авг 2017 в 16:25

Вы можете инкапсулировать свою логику Coffeescript в классы, а затем инициализировать класс в представлениях, которые вам действительно нужны для вызова этой логики.

Таким образом, ваш файл кофе будет выглядеть примерно так:

class YourClass

   constructor: () ->
     # Anything here will be called when this object is instantiated
     @firstMethod()
     @secondMethod()

  firstMethod: () ->
    $('#some-element').click () ->
      alert('hello world')

  secondMethod: () ->
    console.log('second method triggered!')


window.YourClass = YourClass

И затем всякий раз, когда вам нужна эта логика в конкретном представлении, вы можете просто инициализировать этот объект:

<script>
  var yourClass = new YourClass();
</script>

Вы даже можете вызывать определенные методы, переместив их из метода конструктора и явно вызвав их в своем представлении:

<script>
  var yourClass = new YourClass();
  yourClass.methodNotInConstructor();
</script>
0
Alejandro Escobar 28 Авг 2017 в 19:40

Вам следует больше узнать о Rails конвейер ресурсов. Все ваши сценарии выполняются, потому что, скорее всего, у вас есть //= require_tree . директива в вашем файле application.js манифеста.

Если вы хотите вручную указать JS-файлы для действий, вам следует реорганизовать манифест (по крайней мере, удалить из него //= require_tree .), а затем вы можете использовать javascript_include_tag для включения JS вручную. Подробнее здесь.

ПРИМЕЧАНИЕ. Если вы включаете свои файлы вручную, не упоминая их в манифесте, вам также следует добавить Rails.application.config.assets.precompile += %w( path/to/file ) в config/initializers/assets.rb, чтобы он был предварительно скомпилирован. В противном случае вы получите исключение, которое скажет вам сделать это. Более того, здесь.

Если я удаляю дерево требований и пытаюсь добавить их с помощью <% = javascript_include_tag ..%>, мне нужен файл .js, а не кофе. Можно ли загрузить файлы кофе?

Ваши файлы coffeescript все равно прекомпилируются в JS. Все, что вам нужно, это указать имя файла без расширения.

1
Maksim Kalmykov 28 Авг 2017 в 18:27