Rails 5.2: Как мне использовать JS-скрипты для конкретных страниц при использовании Turbolinks?

Я пишу некоторый исследовательский javascript для страницы. Он включает в себя следующую строку:

dashboard_settings.addEventListener('ajax:complete', function(){
  ...

Я разместил скрипт непосредственно перед закрывающим тегом body.

Я заметил, что когда я перехожу на страницу, JS работает так, как я ожидаю, и в консоли нет сообщений об ошибках. Однако, когда я ухожу со страницы, в консоли JS отображается сообщение об ошибке:

Uncaught TypeError: Cannot read property 'addEventListener' of null

Я так понимаю, что это как-то связано с турболинками. Однако я не уверен, как избежать этого, не отключая турболинки.

Есть ли способ указать, что скрипт загружается только для одной страницы?

Я безуспешно пробовал следующее:

<%= yield :page_scripts %>
<% content_for :page_scripts do %>
    <script>
      document.addEventListener('turbolinks:load', function(){
    ...

person user3574603    schedule 21.10.2018    source источник
comment
Я думаю, вам следует попробовать некоторую обработку при загрузке страницы, например: $( document ).on('turbolinks:load', function() {}). См. раздел Turbolinks в документации: guides.rubyonrails.org/   -  person John Baker    schedule 22.10.2018


Ответы (1)


Вы можете добавить прослушиватель, только если элемент существует.

if (dashboard_settings)
  dashboard_settings.addEventListener('ajax:complete', function(){...})

Или, если вы не хотите добавлять его только для определенной страницы, вы можете добавить оператор yield в свой макет и установить его содержимое только для нужной страницы.

#layout
<html>
  <body>
    ...
  </body>
  <%= yield(:after_body) -%>
</html>


#your view
<%= content_for :after_body do -%>
  <script>
    document.addEventListener('turbolinks:load', function(){
      dashboard_settings.addEventListener('ajax:complete', function(){...})
    })
  </script>
<%- end -%>
person arieljuod    schedule 22.10.2018