javascript - Rails webpack js和ajax刷新

标签 javascript ruby-on-rails webpack

我有一个用 webpack 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 .我怎样才能做到这一点?

最佳答案

注意:我假设您使用的是 Rails 6。我还假设您添加了 format.js到您的创建操作。

忘记create.js.erb , 你在这里不需要它。

另外,你不应该把你的代码放在 app/javascript/packs/application.js 中。 .

该文件中的注释如下:

This file is automatically compiled by Webpack, along with any other files present in this directory. You're encouraged to place your actual application logic in a relevant structure within app/javascript and only use these pack files to reference that code so it'll be compiled.



这就是你将如何构建它:
  • 创建文件夹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' %> .将此添加到 View 文件的底部(例如 index.html.erb)。

    希望这可以帮助。

    关于javascript - Rails webpack js和ajax刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58075213/

    相关文章:

    javascript - 当 jsFiddle 说 var 已经定义时如何修复 var

    html - 简单表单中的预填字段

    Webpack:我可以从字符串中提供 "virtual"文件吗?

    javascript - 发送 XMLHttpRequest 时缓存结果有问题吗?

    javascript - Node.js 单击按钮并使用 TCP/IP 协议(protocol)发送内容

    javascript - 如何使用前端 jQuery 更改 MySQL 日期格式

    ruby-on-rails - 在本地切换环境时禁用 New Relic 报告

    javascript - 为什么我在执行 Controller 索引操作时无法通过 Rails 执行 AJAX?

    javascript - 无法修复包漏洞(svg-sprite-loader)

    node.js - NestJS 和 TypeORM 问题有或没有 tsconfig 目标 es5