#javascript #ruby-on-rails #ruby
#javascript #ruby-on-rails #ruby
Вопрос:
Я работаю над приложением Ruby on Rails и не могу найти способ правильно написать свою строку кода для предоставления в качестве аргумента переменной ruby моей функции JS. Я пытаюсь реализовать функцию обратного отсчета в соответствии с датой события.
Вот мой файл JS:
let countdown;
const dynamicCountdown = (eventTime) => {
if (document.querySelector(".timer")) {
// Set a event date for my tests:
// const eventTime = new Date();
// eventTime.setHours(20);
// eventTime.setMinutes(9);
// eventTime.setSeconds(0);
const timeRemaining = Date.parse(eventTime) - Date.parse(new Date());
const hours = Math.floor(timeRemaining / (1000 * 60 * 60) % 24);
const minutes = Math.floor((timeRemaining / 1000 / 60) % 60);
const seconds = Math.floor((timeRemaining / 1000) % 60);
if (timeRemaining < 0) {
clearInterval(countdown);
return;
}
const timerDisplay = document.querySelector(".timer");
const display = `${hours < 10 ? '0' : ''}${hours}:${minutes < 10 ? '0' : ''}${minutes}:${seconds < 10 ? '0' : ''}${seconds}`;
timerDisplay.textContent = display;
}
}
setInterval(dynamicCountdown, 1000);
export { dynamicCountdown }
И часть моего html.erb показывает:
<h3 class="timer">
<%= javascript_tag "dynamicCountdown(@event.date_time)" %>
</h3>
Я попробовал другой способ: javascript_tag
, <script>
HTML-тег… но ничего не работает.
Спасибо за вашу помощь!
—————————- ОБНОВИТЬ ——————————-
Я, наконец, сделал это! Я использовал data-attribut
. Вот как я с этим справился:
Я установил атрибут данных в моем html.erb для доступа к моему значению в моем js-файле <h3 class="timer" data-event-date='<%= @event.date_time %>'>
И в моем html.erb я извлекаю его, используя эти две строки кода: const timer = document.querySelector(".timer");
const eventDate = timer.dataset.eventDate;
Я надеюсь, что это может помочь кому-то еще, кто хочет отправлять данные в свои js-файлы 😉
Комментарии:
1. В erb вы не можете просто «dynamicCountdown(#{@event.date_time})»?
2. Это не работает, я получил сообщение «undefined», когда я console.log(EventTime) и NaN: NaN: NaN на моем таймере, но спасибо за вашу помощь!
Ответ №1:
Вы можете попробовать это в файле erb. Я надеюсь, что это работает
<script>
var date_time = "<%= @event.date_time %>";
dynamicCountdown(date_time);
</script>
Комментарии:
1. К сожалению, я получаю то же сообщение об ошибке, что и код, предложенный nghiamt… Есть идеи, как это исправить?
Ответ №2:
Вы должны переместить setInterval в скрипт в erb-файле
<script>
var event_date_time = "<%= @event.date_time %>";
setInterval(function(){
dynamicCountdown(event_date_time);
}, 1000);
</script>
Комментарии:
1. Спасибо за ваш ответ, я попробовал ваш способ, но я получаю ошибку «Uncaught ReferenceError: dynamicCountdown не определен». Вы знаете, почему мой erb.html файл не может правильно прочитать эту функцию JS?
2. @Aelos-74 Вы включили свой js-файл в свой erb-файл? Вы можете использовать
<%= javascript_include_tag('your_js_file.js') %>
для включения js-файла в erb-файл3. Нет, я этого не делал, может объяснить почему! Если я правильно понял, я должен добавить этот <%= javascript_include_tag(‘dynamic_countdown.js ‘) %> в верхней части моего html.erb, верно? Если да, я пытался, но я получаю ошибку конвейера активов… Нужно ли указывать конкретный путь? Мой js-файл находится в app/javascript/components/dynamic_countdown.js
4. да, вы должны добавить
<%= javascript_include_tag('dynamic_countdown.js') %>
в начало вашего erb-файла, чтобы включить этот js-файл. Если нет, ваш js-код не будет включен в erb-файл, поэтому функция dynamicCountdown не может быть вызвана.5. Какую версию Rails вы используете?