【问题标题】:Full Calendar wont show events taken from AJAX完整日历不会显示取自 AJAX 的事件
【发布时间】:2020-10-04 21:31:34
【问题描述】:

我需要使用 AJAX 从数据库中获取一些事件并将它们显示在我的完整日历中。问题是我的 JSON 提要没有 startend,但所有日期都由 , 分隔(例如:15-06-2020,16-06-2020)我希望使用 @987654327 @ 并从那里设置值但无法使其工作。这是我尝试过的

document.addEventListener('DOMContentLoaded', function() {

  var calendarEl = document.getElementById('calendar');

  var calendar = new FullCalendar.Calendar(calendarEl, {
    plugins: ['dayGrid'],
    editable: true,
    firstDay: 1,
    eventLimit: true,
    events: function(start, end, callback) {

      $.ajax({
        type: "GET",
        url: "http://localhost:8092/api/leavecal/getleavesbyemp/200027502420",
        dataType: "json",
        success: function(data) {

          var eventsList = [];
          var count = 0;
          while (count < data.length) {

            var dateArray = data[count].date.split(',');
            var startDate = dateArray[0];
            var endDate = dateArray[dateArray.length - 1];

            eventsList.push({
              start: startDate,
              end: endDate
            });

            console.log(startDate + " " + endDate);
            count++

          }
          callback(eventsList);

        }
      });

    }

  });

  calendar.render();
});
&lt;div id="calendar"&gt;&lt;/div&gt;

我不知道从这里去哪里

【问题讨论】:

  • 您需要以支持的格式提供您的日期,该格式没有任何歧义的余地。例如yyyy-mm-dd 更好,因为 a) 它受 JS Date / fullCalendar 支持(请参阅fullcalendar.io/docs/date-parsing),并且 b) 它不能在 dd-mm-yyyy 和 mm-dd-yyyy 之间混淆。当您使用它时,为什么不更改您的 API,以便它也在单独的字段中输出日期?
  • 另外events: function(start, end, callback) { 不正确 - 请参阅fullcalendar.io/docs/events-function。 (我假设您在没有意识到的情况下从 v3 代码中获取了一个示例。v4 具有不同的语法)。而且您确实应该将提供的开始日期和结束日期发送到您的服务器,以便它可以将返回的结果限制为仅当前日历中实际需要的结果 - 否则,如果您有很多历史事件(一旦您的应用程序活一段时间),你最终会毫无意义地下载大量数据,其中 90% 永远不会被查看。
  • @ADyson 我将日期更改为 yyy-mm-dd 格式,感谢您的提示。正如您提到的,我不小心使用了 v3 功能。我尝试使用网站中给出的 v4 格式,但我现在有点困惑。我应该对 ajax 使用相同的格式,还是可以使用我使用的 "GET" 方法?
  • “我应该对 ajax 使用相同的格式吗”...是的,这与函数语法的更改无关。您的主要问题是 callback() 不会将事件发送回 fullCalendar,因为它是函数的错误输入参数。无论如何,下面的答案应该对您有所帮助

标签: javascript jquery date fullcalendar fullcalendar-4


【解决方案1】:

假设:

  • 由于问题没有指定版本,我假设是最新的稳定版本,4.4
  • 我还将提供日期数组

为了一切正常,您需要更改日期格式,除非您change the locale

如果您将日期作为字符串 15-06-2020,16-06-2020,只需从中创建一个简单的数组并使用下面的代码

function convertToObjects(str) {
    // str = "15-06-2020,16-06-2020"
    return str.split(',').map(function(elm) { return { date: elm }; })
}

事件签名在您的代码中不正确,它应该是,正如 @ADyson 指出的 the docs show(info, successCallback, failureCallback) 您将事件数组传递到 successCallback([]) 或任何错误进入failureCallback(new Error('Not good!'))info 是您可以获取请求的数据范围的地方。

function getAllEvents(info, successCallback, failureCallback) {
  const data = [
    { date: '15-06-2020' },
    { date: '16-06-2020' }
  ];
  // const data = convertToObjects(<your string of dates>);
  successCallback(processData(data));
}

function processData (arr) {
  // [{date;'15-06-2020'},{date:'16-06-2020'}]
  const eventsList = [];

  arr.forEach(function(entry, i) {
    // 15-06-2020 -> 2020-06-15
    const dt = entry.date;
    const formattedDate = `${dt.substr(6,4)}-${dt.substr(3,2)}-${dt.substr(0,2)}`;
    eventsList.push({
      id: `evt-${i+1}`,
      start: formattedDate,
      end: formattedDate,
      title: `Event #${i+1}`
    });
  });

  return eventsList;
}

document.addEventListener("DOMContentLoaded", function () {
  const calendarEl = document.getElementById("calendar");
  const calendar = new FullCalendar.Calendar(calendarEl, {
    plugins: ['dayGrid'],
    editable: true,
    firstDay: 1,
    eventLimit: true,
    events: getAllEvents,
  });

  calendar.render();
});
<!-- CSS -->
<link href="https://unpkg.com/@fullcalendar/daygrid@4.4.0/main.css" rel="stylesheet"/>
<link href="https://unpkg.com/@fullcalendar/core@4.4.0/main.min.css" rel="stylesheet"/>

<!-- JS -->
<script src="https://unpkg.com/@fullcalendar/core@4.4.0/main.min.js"></script>
<script src="https://unpkg.com/@fullcalendar/daygrid@4.4.0/main.js"></script>


<div id="calendar"></div>

首先在https://codepen.io/balexandre/pen/NWxRGGd?editors=1010上起草的答案

【讨论】:

  • 非常感谢!我也会将格式更改为 yyyy-mm-dd。将此连接到我的 api,但目前只显示最后一项,但我可以找到解决方法。再次感谢!
  • debugger添加到代码行中,这将停止执行并进入调试模式,因此您可以添加更多断点并逐行检查变量以及发生了什么...请记住,每个事件都应该有一个id,以便可以区别对待
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-18
  • 2020-07-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多