Fullcalendar refetch事件源

时间:2019-11-28 07:48:53

标签: javascript fullcalendar fullcalendar-scheduler fullcalendar-4

正如标题所述,我对全日历中的EventSource有疑问。

目前,我可以在全日历中加载1个Google日历。并且知道如何添加多个Google日历。

但是,我想使用复选框(链接到他们自己的Google日历),我使用googleCalendarIds动态创建一个数组,所有这些工作正常,但是我无法让日历“重载”来自Google的所有事件数组中的日历。

此刻,这是我用来填充日历的代码:

document.addEventListener('DOMContentLoaded', function() {
var selected = [];
$('.badgebox:checked').each(function() {
    selected.push({
        'googleCalendarId' : $(this).val(),
        'className' : $(this).data('color')
    });
});
$('.badgebox').on('click', function() {
    if($(this).prop('checked')) {
        selected.push({
            'googleCalendarId' : $(this).val(),
            'className' : $(this).data('color')
        });
        $('#calendar').fullCalendar('refetchResources');
    }else{
        index = selected.findIndex(obj => obj.googleCalendarId === $(this).val());
        selected.splice(index, 1);
        $('#calendar').fullCalendar('refetchResources');
    }
});
var calendarEl = document.getElementById('calendar');
calendar = new FullCalendar.Calendar(calendarEl, {
    header: {
        center: 'dayGridMonth,timeGridWeek'
    },
    views: {
        dayGridMonth: {
            titleFormat: { year: 'numeric', month: '2-digit', day: '2-digit' }
        }
    },
    plugins: [ 'dayGrid', 'timeGrid', 'bootstrap', 'googleCalendar' ],
    googleCalendarApiKey: 'api key',
    eventSources: selected,
    eventClick: function(info) {
        info.jsEvent.preventDefault();
    },
    defaultView: 'timeGridWeek',
    weekNumbers: true,
    locale: 'nl',
    themeSystem: 'bootstrap',
    nowIndicator: true
});

calendar.render();

});

但是我得到的是一个错误:

TypeError: $(...).fullCalendar is not a function

我已经加载了所有需要的文件(并且可以看到它们已加载)。

编辑当前代码

这是我现在使用的代码,但仍不确定如何修复资源部分(刷新):

document.addEventListener('DOMContentLoaded', function() {
    var curSource = [];
    $('.badgebox:checked').each(function() {
        curSource.push({
            'googleCalendarId' : $(this).val(),
            'className' : $(this).data('color')
        });
    });
    var newSource = [];
    var calendarEl = document.getElementById('calendar');
    var calendar = new FullCalendar.Calendar(calendarEl, {
        schedulerLicenseKey: 'key',
        header: {
            center: 'dayGridMonth,timeGridWeek'
        },
        views: {
            dayGridMonth: {
                titleFormat: { year: 'numeric', month: '2-digit', day: '2-digit' }
            }
        },
        plugins: [ 'dayGrid', 'timeGrid', 'bootstrap', 'googleCalendar', 'resourceTimeGrid', 'resourceDayGrid' ],
        googleCalendarApiKey: 'apikey',
        eventSources: curSource,
        eventClick: function(info) {
            info.jsEvent.preventDefault();
        },
        defaultView: 'timeGridWeek',
        weekNumbers: true,
        locale: 'nl',
        themeSystem: 'bootstrap',
        nowIndicator: true
    });
    $('.badgebox').on('change', function() {
        if($(this).prop('checked')) {
            newSource.push({
                'googleCalendarId' : $(this).val(),
                'className' : $(this).data('color')
            });
        }else{
            index = newSource.findIndex(obj => obj.googleCalendarId === $(this).val());
            newSource.splice(index, 1);
        }
        curSource = newSource;
        calendar.getEventSources().forEach(eventSource => {
            eventSource.remove()
        });
        calendar.addEventSource(curSource);
    });
    calendar.render();
});

有什么主意吗?

1 个答案:

答案 0 :(得分:1)

您添加和删除事件源的逻辑存在缺陷-它会删除所有以前的源,但是只会添加当前选择的源(嗯,除非您从未清除newSource,否则它将包含所有一段时间后会出现一些重复)。另一个问题是,当您编写calendar.addEventSource(curSource);时,您要添加事件源的 array (即使它只包含一个项目),但是却将其添加为单个事件源 object 。因此,它不是fullCalendar期望的格式,因此它不会添加任何内容。

相反,您可以使用与首次声明日历时相同的逻辑来遍历所有当前选中的复选框,并将所有复选框设置为当前来源。这是最简单的方法。只需将逻辑移到一个函数中即可重新使用它。它还消除了包含源列表的全局对象的必要性。像这样:

  function getEventSources() {
    var sources = [];
    $(".badgebox:checked").each(function() {
      sources.push({
        id: $(this).val(),
        'googleCalendarId' : $(this).val(),
        className: $(this).data("color")
      });
    });
    return sources;
  }

然后在日历配置中,通过调用函数设置初始事件源:

eventSources: getEventSources(),

并按如下所示处理复选框上的“更改”事件:

  $(".badgebox").on("change", function() {
    //remove event sources
    calendar.getEventSources().forEach(eventSource => {
      eventSource.remove();
    });
    //get currently selected sources
    var sources = getEventSources();

    //add each new source to the calendar
    sources.forEach(eventSource => {
      calendar.addEventSource(eventSource);
    });
  });

我在此处进行了现场演示:https://codepen.io/ADyson82/pen/Jjoovym。显然,我无法使用Google日历进行演示,因此我使用事件的硬编码列表完成了该操作,但是该过程的总体逻辑是相同的。