简体   繁体   English

fullcalendar.io 5:addEventSource 无法从外部工作 function

[英]fullcalendar.io 5: addEventSource not work from external function

For a small project I want to add events at runtime.对于一个小项目,我想在运行时添加事件。

The actual calendar is created with data from a database.实际日历是使用数据库中的数据创建的。 The separate script creates additional events, which are created dynamically at runtime of the calendar.单独的脚本创建额外的事件,这些事件是在日历运行时动态创建的。 These events should be added to the existing calendar afterwards.之后应将这些事件添加到现有日历中。

For testing I have a calendar and an external button.为了测试,我有一个日历和一个外部按钮。 If you click on the button, an event should be added to the calendar.如果单击该按钮,应将一个事件添加到日历中。 Calendar is created and the click is recognized.日历已创建并且点击被识别。 But no event is added.但是没有添加任何事件。

Where is the thought error?思想错误在哪里?

The HTML HTML

<button class="holiday">Add Feiertage</button>
<div id='calendar'></div>

The Code:代码:

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

  var calendar = new FullCalendar.Calendar(calendarEl, {
    headerToolbar: {
      left: 'prev,next today',
      center: 'title',
      right: 'dayGridMonth,timeGridWeek'
    },
    initialDate: '2020-11-12',
    businessHours: true, // display business hours
    editable: true,
    events: [
      {
        title: 'Business Lunch',
        start: '2020-11-03T13:00:00',
        constraint: 'businessHours'
      },
      {
        title: 'Meeting',
        start: '2020-11-13T11:00:00',
        constraint: 'availableForMeeting', // defined below
        color: '#257e4a'
      },
      {
        title: 'Conference',
        start: '2020-11-18',
        end: '2020-11-20'
      },
      {
        title: 'Party',
        start: '2020-11-29T20:00:00'
      },

      // areas where "Meeting" must be dropped
      {
        groupId: 'availableForMeeting',
        start: '2020-11-11T10:00:00',
        end: '2020-11-11T16:00:00',
        display: 'background'
      },
      {
        groupId: 'availableForMeeting',
        start: '2020-11-13T10:00:00',
        end: '2020-11-13T16:00:00',
        display: 'background'
      },

      // red areas where no events can be dropped
      {
        start: '2020-11-18',
        title: 'Test-Holiday',
        overlap: false,
        display: 'background',
        color: '#ff9f89'
      }
    ]
  });

  calendar.render();
});

// external events by Click
jQuery(document).ready(function($) {
   $('.holiday').on('click', function() {
   console.log('klick');

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

    //var src = calendar.getEventSources(); // give me a empty array

    calendar.addEventSource(
      {
        events: [ // put the array in the `events` property
          {
            title  : 'Test-Event',
            start  : '2020-11-11',
            overlap: false,
            display: 'background',
            color: '#ff9f89'
          }
        ]
      });
    calendar.refetchEvents();
  });
 });
});

Here is my Test: https://jsfiddle.net/LukasHH/tu14xfwr/这是我的测试: https://jsfiddle.net/LukasHH/tu14xfwr/

The calendar variable you're using for calendar.addEventSource refers to a different FullCalendar instance than the one which is shown on your page.您用于calendar.addEventSourcecalendar变量指的是与页面上显示的实例不同的 FullCalendar 实例。 You have created a completely new calendar - but then didn't render it to the page.您已经创建了一个全新的日历 - 但没有将其呈现到页面上。 That's why you don't get errors, but also nothing useful happens.这就是为什么你没有得到错误,但也没有任何有用的事情发生。

The original calendar is defined and populated inside your document.addEventListener('DOMContentLoaded', function() { block, but you tried to create a new one inside your jQuery(document).ready(function($) { block. You need to use the existing reference to calendar - but of course it's out of scope when you need it, because you're in a different code block.原始calendar在您的document.addEventListener('DOMContentLoaded', function() {块中定义并填充,但您试图在jQuery(document).ready(function($) {块中创建一个新日历。您需要使用对calendar的现有引用 - 但当然,当你需要它时它不在 scope 中,因为你在不同的代码块中。

Now, document.addEventListener('DOMContentLoaded', function() { and jQuery(document).ready(function($) { are essentially equivalent, it's just that one is written in native JS and one is jQuery syntax. They basically do the same task - ie delay execution of the code until the DOM is completely loaded. Therefore it doesn't make much sense or add any value to have both of them in the page at the same time. Just use one block to include all of your code, and then you won't have any scope problems regardless.现在, document.addEventListener('DOMContentLoaded', function() {jQuery(document).ready(function($) {本质上是等价的,只是一个是原生 JS 写的,一个是 jQuery 语法。他们基本上是做相同的任务 - 即延迟执行代码,直到 DOM 完全加载。因此,将它们同时放在页面中没有多大意义或添加任何值。只需使用一个块来包含您的所有内容代码,然后无论如何你都不会有任何 scope 问题。

As well as that, for similar reasons it also makes no sense to have another document.addEventListener('DOMContentLoaded', function() { within the jQuery "ready" block. You simply don't need it. I can only assume you didn't understand what that code did and thought it was part of fullCalendar - it's not.除此之外,出于类似的原因,jQuery “就绪”块中有另一个document.addEventListener('DOMContentLoaded', function() {也是没有意义的。你根本不需要它。我只能假设你没有不明白该代码做了什么,并认为它是 fullCalendar 的一部分 - 它不是。

And

var i = calendar.initialEvents();
console.log(i);    

makes no sense.没有意义。 There's no method called initialEvents in fullCalendar and you don't seem to be trying to use i for anything anyway, so you can just remove these lines. fullCalendar 中没有名为 initialEvents 的方法,而且您似乎并没有尝试将i用于任何事情,因此您可以删除这些行。

eg例如

jQuery(document).ready(function($) {
  var calendarEl = document.getElementById('calendar');
  var calendar = new FullCalendar.Calendar(calendarEl, {
    //...etc
  });
  calendar.render();

  $('.holiday').on('click', function() {
    calendar.addEventSource({
      events: [ // put the array in the `events` property
      {
        title: 'Test-Event',
        start: '2020-11-11',
        overlap: false,
        display: 'background',
        color: '#ff9f89'
      }
    ]
  });
});

Demo: https://jsfiddle.net/32w4kLvg/演示: https://jsfiddle.net/32w4kLvg/

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM