Где разместить Javascript, используемый только на одной странице в Rails 7 с помощью importmap
При использовании Rails 7 с картами импорта, куда мне поместить код, который должен выполняться только одним представлением?
В частности, у меня есть представление, которое требует запуска кода Javascript при загрузке. Мой Javascript выглядит примерно так:
import {TheController} from "./TheController"
let controller = new TheController();
document.onreadystatechange = function () {
if (document.readyState === 'complete') {
controller.onLoad();
}
};
Как настроить среду Javascript, чтобы
document.onreadystatechange
код выполняется только нужным видом? (Все почти работает, когда я помещаю этот код в файл, импортированный
application.js
, но затем он выполняется каждым представлением.)
Я подозреваю, что ответ заключается в создании отдельных файлов importmap и importmap_tags; но я могу найти любые демонстрации того, как это сделать в Rails 7.
3 ответа
Как указывает @Azrklm, ответ содержится в этом видео https://youtu.be/PtxZvFnL2i0?t=1287 , начиная с 21:38.
Предположим, у нас есть некоторый JavaScript, который мы хотим запустить только в представлении с именем . Вот шаги
Разместите уникальный код
FancyView
в своем собственном файле, скажем (и удалите его изapplication.js
, если необходимо).Добавьте строку для
FancyView.js
на карту импорта:pin "FancyView"
Добавьте строку
<%= yield :head %> to
application.html.erb`. (Это сообщает Rails, что отдельные представления/макеты могут захотеть добавить дополнительную информацию в заголовок веб-страницы.)<%= stylesheet_link_tag "application", "data-turbo-track": "reload" %> <%= javascript_importmap_tags %> <%# This loads application.js %> <%= yield :head %>
Добавить
javascript_import_module_tag
на вид:<% content_for :head do %> <%= javascript_import_module_tag "FancyView" %> <% end %>
Если у кого-то есть аналогичная проблема, найдет этот вопрос, я нашел ответ от @Zack совершенно кратким и именно тем, что мне нужно, НО с двумя важными оговорками:
Я не мог использовать соглашение об именах capcase для своих js.
FancyView
нужно бытьfancyView
.javascript_import_module_tag должен идти после ваших javascript_importmap_tags
<%= javascript_importmap_tags %> <%= yield(:head) %>
Это также теперь объясняется на странице github rails: https://github.com/rails/importmap-rails#selectively-importing-modules
Спасибо @Зак!
DHH объясняет это довольно хорошо, посмотрите, пожалуйста, https://youtu.be/PtxZvFnL2i0?t=1287