Rails Webpack JS и обновить на AJAX - PullRequest
       0

Rails Webpack JS и обновить на AJAX

2 голосов
/ 24 сентября 2019

У меня есть модуль календаря, представленный в веб-пакете js - app/javascript/packs/application.js

document.addEventListener('DOMContentLoaded', function() {
  var calendarEl = document.getElementById('calendar');

  var calendar = new Calendar(calendarEl, {
    plugins: [ interactionPlugin, dayGridPlugin, timeGridPlugin, listPlugin, momentPlugin ],
    header: {
      left: 'prev,next today',
      center: 'title',
      right: 'dayGridMonth,timeGridWeek,timeGridDay,listWeek'
    },
    defaultDate: '2018-01-12',
    navLinks: true, // can click day/week names to navigate views
    editable: true,
    eventLimit: true, // allow "more" link when too many events
    selectable: true,
    events: '/events.json',
    select: function(info) {
      $.getScript('/events/new', function(){
        $('#event_date_range').val(moment(info.start).format('YYYY-MM-DD HH:mm') + ' - ' + moment(info.end).format('YYYY-MM-DD HH:mm'));
        $('#start_date').val(moment(info.start).format('YYYY-MM-DD HH:mm'));
        $('#end_date').val(moment(info.end).format('YYYY-MM-DD HH:mm'));
      });
    }
  });

  calendar.render();
});

У меня есть действие создания, и я хотел бы повторно обработать календарь при успешном обратном вызове - create.js.erb.Как я могу это сделать?

1 Ответ

0 голосов
/ 29 сентября 2019

Примечание: я предполагаю, что вы используете Rails 6. Я также предполагаю, что вы добавили format.js к своему действию создания.

Забудьте о create.js.erb, он вам здесь не понадобится.

Кроме того, вы не должны помещать свой код в app/javascript/packs/application.js.

Комментарии в этом файле гласят:

Этот файл автоматически компилируется Webpack, вместе с любыми другими файлами, присутствующими в этом каталоге .Вам рекомендуется поместить действительную логику приложения в соответствующую структуру в app / javascript и использовать только эти файлы пакета для ссылки на этот код , чтобы он был скомпилирован.

Вот как вы бы это структурировали:

  1. Создайте папку app/javascript/calendar и внутри этой папки создайте файл index.js с вашим кодом в нем:

// import your calendar object (put it in a file calendar.js in the same folder)
import Calendar from './calendar';

document.addEventListener('DOMContentLoaded', function() {
  var calendarEl = document.getElementById('calendar');

  var calendar = new Calendar(calendarEl, {
    plugins: [ interactionPlugin, dayGridPlugin, timeGridPlugin, listPlugin, momentPlugin ],
    header: {
      left: 'prev,next today',
      center: 'title',
      right: 'dayGridMonth,timeGridWeek,timeGridDay,listWeek'
    },
    defaultDate: '2018-01-12',
    navLinks: true, // can click day/week names to navigate views
    editable: true,
    eventLimit: true, // allow "more" link when too many events
    selectable: true,
    events: '/events.json',
    select: function(info) {
      $.getScript('/events/new', function(){
        $('#event_date_range').val(moment(info.start).format('YYYY-MM-DD HH:mm') + ' - ' + moment(info.end).format('YYYY-MM-DD HH:mm'));
        $('#start_date').val(moment(info.start).format('YYYY-MM-DD HH:mm'));
        $('#end_date').val(moment(info.end).format('YYYY-MM-DD HH:mm'));
      });
    }
  });

  // actually, you want to put that addEventListener on your form
  // more on 'ajax:success': https://guides.rubyonrails.org/working_with_javascript_in_rails.html#rails-ujs-event-handlers
  document.body.addEventListener('ajax:success', function(event) {
    var detail = event.detail;
    var data = detail[0], status = detail[1], xhr = detail[2];

    if (status === 'OK') { // upon success
      // do something
      // re-render the calendar
      calendar.render();
    }
  })

  calendar.render();
});

Обратите внимание на часть, которую я добавил:

  // actually, you want to put that addEventListener on your form
  // more on 'ajax:success': https://guides.rubyonrails.org/working_with_javascript_in_rails.html#rails-ujs-event-handlers
  document.body.addEventListener('ajax:success', function(event) {
    var detail = event.detail;
    var data = detail[0], status = detail[1], xhr = detail[2];
    if (status === 'OK') { // upon success
      // do something
      // re-render the calendar
      calendar.render();
    }
  })

Далее вы создаете файл пакета app/javascript/packs/calendar.js и внутри него просто ссылаетесь на свой модуль так:

// importing calendar module
import '../calendar';

Теперь Webpack автоматически скомпилирует ваш файл.

Осталось использовать помощника javascript_pack_tag, который добавляет тег сценария, который ссылается на файл именованного пакета, скомпилированный webpack: <%= javascript_pack_tag 'calendar' %>.Добавьте это внизу вашего файла представления (например, index.html.erb).

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...