FullCalendar v4 - 如何用表单在日历上显示事件?

问题描述 投票:0回答:1

我无法用bootstrap模态表单动态添加事件。我设法抓住点击任何日期和模式打开。我完成了输入,但我不能让它们显示在日历上。我得到了输入的值,并将它们保存在变量中,以便通过addEvent将它们传递到日历上,但我做不到。我是第一次接触编程,希望得到帮助。

之二 我无法用bootstrap模态表单动态添加事件。我设法捕捉到任何日期的点击,然后模态打开。我完成了输入,但我不能让它们显示在日历上。我得到了输入的值,并把它们保存在变量中,以便用addEvent把它们传到日历上,但我做不到。我是第一次接触编程,希望得到帮助。

这里是FullCalendar和Js

// VARIABLES
    // Leen el valor de cada campo del formulario
    let titulo = document.querySelector("#titulo").value    
    let descripcion = document.querySelector("#descripcion").value
    let fecha = document.querySelector("#fecha").value
    let hora = document.querySelector("#hora").value
    let color = document.querySelector("#color").value
    // Submit formulario
    let enviar = document.querySelector("#btnAgregar") 

  // FULLCALENDAR
  document.addEventListener('DOMContentLoaded', function () {
    let calendarEl = document.getElementById('calendar');

    let calendar = new FullCalendar.Calendar(calendarEl, {
      locale: "es",
      plugins: ["interaction", "dayGrid", "timeGrid"],
      selectable: true,
      defaultView: "timeGridWeek",
      header: {
        left: "prev,next today",
        center: "title",
        right: "timeGridDay,timeGridWeek,dayGridMonth",
      },

      // Selecciona con click en una fecha/hora determinada
      dateClick: function () {

        // Acciona el modal
        $("#modalEventos").modal()

        // EVENT LISTENER
        enviar.addEventListener("submit", enviarEvento)

        // FUNCIONES
        function enviarEvento() {
          calendar.addEvent({    // https://fullcalendar.io/docs/event-model
            title: titulo,
            description: descripcion,
            start: fecha,   // dateStr  
            hora: hora,   // 'T00:00:00'
            color: color
          })
          //Cierra el modal
          $('#modalEventos').modal('toggle'); // hide
        }
      },

    });
    calendar.render();
  });

这是我使用的表单的HTML。

<!-- Modal -->
        <div class="modal fade" id="modalEventos" data-backdrop="static" data-keyboard="false" tabindex="-1" role="dialog"
            aria-labelledby="staticBackdropLabel" aria-hidden="true">
            <div class="modal-dialog">
                <div class="modal-content">
                    <div class="modal-header">
                        <h5 class="modal-title" id="tituloEvento">Agregar Evento</h5>
                        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                            <span aria-hidden="true">&times;</span>
                        </button>
                    </div>
                    <form action="#" id="guardar">
                        <div class="modal-body">
                            <div class="form-group row" id="elTitulo">
                                <label for="titulo" class="col-sm-2 col-form-label">Titulo</label>
                                <div class="col-sm-10">
                                    <input type="text" class="form-control" id="titulo">
                                </div>
                            </div>

                            <div class="form-group row">
                                <label for="descripcion" class="col-sm-2 col-form-label">Descripción</label>
                                <div class="col-sm-10">
                                    <textarea class="form-control" id="descripcion" rows="2"></textarea>
                                </div>
                            </div>
                            <div class="form-group row">
                                <label for="fecha" class="col-sm-2 col-form-label">Fecha</label>
                                <div class="col-sm-10">
                                    <input type="text" class="form-control" id="fecha" value="">
                                </div>
                            </div>
                            <div class="form-group row">
                                <label for="hora" class="col-sm-2 col-form-label">Horario</label>
                                <div class="col-sm-10">
                                    <input type="text" class="form-control" id="hora">
                                </div>
                            </div>
                            <div class="form-group row">
                                <label for="color" class="col-sm-2 col-form-label">Color</label>
                                <div class="col-sm-3">
                                    <input type="color" class="form-control" id="color" value="#3788d8">
                                    </select>
                                </div>
                            </div>
                        </div>
                        <div class="modal-footer">
                            <button type="submit" class="btn btn-primary" id="btnAgregar">Agregar</button>
                            <button type="button" class="btn btn-secondary" data-dismiss="modal">Cancelar</button>
                        </div>
                    </form>
                </div>
            </div>
        </div>
javascript fullcalendar dom-events addeventlistener
1个回答
1
投票

我可以看到两个问题--一个肯定是问题,另一个可能是(虽然我还没有测试过)。

1) 你从模态输入中获取值的方式绝对是个问题。你的代码在页面第一次加载时就获取了这些值,并将它们放入变量中。但是,由于这发生在页面加载时,这意味着这是 之前 用户有任何机会输入任何东西!然后您保留这些变量,直到您尝试将其添加到日历中。然后,你保留这些变量,直到你尝试将其添加到日历中。你需要等到用户点击了提交按钮之后,才会尝试查看他们输入的内容。

2) 你的函数 enviarEvento 和它相关的事件监听器都是在 "dateClick "回调中声明的,这意味着每次有人点击时都会声明一个新版本的函数和监听器。这并不是必须的,虽然我还没有测试过,但也有可能会表现出JavaScript处理闭包的方式--例如,你可能会发现,由于事件处理程序的积累,它在每次点击时都会重新添加所有之前添加的事件。你可以把这些移到日历声明之外。

这是一个固定的版本。

// FULLCALENDAR
document.addEventListener('DOMContentLoaded', function () {
  // Submit formulario
  let enviar = document.querySelector("#btnAgregar");
  let calendarEl = document.getElementById('calendar');

  let calendar = new FullCalendar.Calendar(calendarEl, {
    locale: "es",
    plugins: ["interaction", "dayGrid", "timeGrid"],
    selectable: true,
    defaultView: "timeGridWeek",
    header: {
      left: "prev,next today",
      center: "title",
      right: "timeGridDay,timeGridWeek,dayGridMonth",
    },

    // Selecciona con click en una fecha/hora determinada
    dateClick: function () {

      // Acciona el modal
      $("#modalEventos").modal();
    },
  });

  calendar.render();

  // EVENT LISTENER
  enviar.addEventListener("submit", enviarEvento)

  // FUNCIONES
  function enviarEvento() {

    let titulo = document.querySelector("#titulo").value;
    let descripcion = document.querySelector("#descripcion").value;
    let fecha = document.querySelector("#fecha").value;
    let hora = document.querySelector("#hora").value;
    let color = document.querySelector("#color").value;

    calendar.addEvent({    // https://fullcalendar.io/docs/event-model
      title: titulo,
      description: descripcion,
      start: fecha,   // dateStr  
      hora: hora,   // 'T00:00:00'
      color: color
    });

    //Cierra el modal
    $('#modalEventos').modal('toggle'); // hide
  }
});

还有一些建议

1) dateClick 函数会告诉你被点击的日期,但你忽略了那个输入的值。你可以用它来预先填充你的模态中的 "开始 "字段,这样用户就不用输入它了。请看 https:/fullcalendar.iodocsdate点击

2)更好的是,如果您从使用 dateClickselect 回调,那么当你使用 "时间网格 "或 "时间线 "视图时,它将允许用户拖放(或只是点击)选择一个特定的时间段,然后告诉你他们选择的开始和结束日期& 时间--同样,你可以使用它来预先填充表单,使其更方便用户。查看 https:/fullcalendar.iodocsselect-callback。

© www.soinside.com 2019 - 2024. All rights reserved.