FullCalendar-选择Overlap可防止创建全天事件

FullCalendar-选择Overlap可防止创建全天事件,fullcalendar,fullcalendar-4,Fullcalendar,Fullcalendar 4,因为函数只通过重叠的事件,而不是选择,所以很难自定义如何处理事件创建 在我的例子中,我们正在使用日历/日记系统,背景事件显示员工的班次,事件显示员工的个人预订 此时,除了背景事件之外,绝对没有任何事件能够相互重叠 然而。。。除此之外,我们还将覆盖“全天活动”-可能有很多事情,但举例来说,假设它们是“员工生日”-因此,今天可能会有几个活动,但全天部分将有一个活动,显示某人的生日 我正在检查eventOverlap,并对处理不同碰撞的eventDrop和eventResize执行一些其他检查,但这些

因为函数只通过重叠的事件,而不是选择,所以很难自定义如何处理事件创建

在我的例子中,我们正在使用日历/日记系统,背景事件显示员工的班次,事件显示员工的个人预订

此时,除了背景事件之外,绝对没有任何事件能够相互重叠

然而。。。除此之外,我们还将覆盖“全天活动”-可能有很多事情,但举例来说,假设它们是“员工生日”-因此,今天可能会有几个活动,但全天部分将有一个活动,显示某人的生日

我正在检查eventOverlap,并对处理不同碰撞的eventDrop和eventResize执行一些其他检查,但这些仅适用于正在移动或调整大小的现有事件。我想在事件创建上做同样的事情——在选择过程中发生。为了禁止选择已经有事件的空格,我使用selectOverlap文档中的示例函数:

function(event) {
    return event.rendering === 'background';
}
这真是妙不可言。但是,如果我尝试创建一个新的全天事件,它将“重叠”当天存在的任何其他事件,并且无法通过此检查。 我希望能够使用selection的对象来检查allDay=true,但是函数只传递了现有的事件,无法检查所选的部分

您可以在此处看到一个非常简化的演示:

尝试在已发生事件的当天创建全天事件

有更好的方法吗?我可以完全删除selectOverlap并在中执行所有操作,但我需要基本上复制重叠检查,以使其正常工作,我觉得这对于一些应该相对简单的事情来说似乎有些过分了


执行selectOverlap功能时,是否不仅可以获取重叠事件对象,还可以获取选择对象?

当前的解决方法是删除selectOverlap检查,而是在SelectCallback中自己执行

下面是我编写的使用select={this.handleEventCreate}时调用的快速函数的简化版本:


从2019年7月起,建议使用此方法处理select回调中的selectOverlap。我提出了一个功能请求,让selectOverlap函数接收新事件和重叠事件,以便在将来更轻松:在使用FullCalendar Vue调用方法时如何获取this.calendarRef,有什么想法吗?TaHi@raison-我不知道,因为我正在为此使用ReactJS,但它可能非常类似-this.calendarRef是在类中定义的,只是calendarRef=React.createRef;-将更新上面的答案以显示更详细的信息。还要注意,calendarRef是我自己命名的一个变量-在fullCalendar中找不到它-但在我的示例中,它引用React.createRef。
class Diary extends React.Component {

    //additional functions, state definitions, etc etc etc here.

    //Define calendarRef as it will be needed in the function below
    calendarRef = React.createRef();


    handleEventCreate = (info) => {
        // Get the Calendar API to allow unselection
        let calendarApi = this.calendarRef.current.getApi();

        // Get all Events
        let checkEvents = calendarApi.getEvents();
        // Loop through them
        checkEvents.forEach(function(event){
            // If it's not a background element, check whether the new element contains the existing, or vice versa.
            if(event.rendering !== "inverse-background" && 
                    (
                        (event.start >= info.start && event.start <= info.end) ||
                        (event.end >= info.start && event.end <= info.end) ||
                        (info.start >= event.start && info.start <= event.end) ||
                        (info.end >= event.start && info.end <= event.end)
                    )
                ){
                    // It is an overlapping event, so we reject it.
                    return calendarApi.unselect();
                }
        });

        alert('All good here to create the event.');
        //extra event creation code to fire here.
    }