【问题标题】:Can I prevent events with conflict time?我可以防止有冲突时间的事件吗?
【发布时间】:2013-03-25 21:20:38
【问题描述】:

如何防止发生冲突时间的事件?有什么变量要设置吗?

【问题讨论】:

标签: fullcalendar


【解决方案1】:

不,没有要设置的变量,但您可以使用 clientEvents 之类的东西来检索 fullcalendar 在内存中的事件。您可以在eventDrop 中使用以下功能。在下面的例子中,它使用一个函数来过滤事件是否有重叠。

function checkOverlap(event) {  

    var start = new Date(event.start);
    var end = new Date(event.end);

    var overlap = $('#calendar').fullCalendar('clientEvents', function(ev) {
        if( ev == event)
            return false;
        var estart = new Date(ev.start);
        var eend = new Date(ev.end);

        return (Math.round(estart)/1000 < Math.round(end)/1000 && Math.round(eend) > Math.round(start));
    });

    if (overlap.length){  
            //either move this event to available timeslot or remove it
       }                  
  }

【讨论】:

  • 太棒了,有什么建议可以让我在 dayClick 上使用它吗?
【解决方案2】:

您可以在 celendar 配置中添加 eventOverlap : false , http://fullcalendar.io/docs/event_ui/eventOverlap/

【讨论】:

  • 这仅适用于 v2 fullcalendar,而其他两个似乎适用于 v1 和 v2。
【解决方案3】:

正确的重叠检查。

        eventDrop: function(event, dayDelta, minuteDelta, allDay, revertFunc, jsEvent, ui, view) {
            /// deny overlap of event
            var start = new Date(event.start);
            var end = new Date(event.end);

            var overlap = $('#calendar').fullCalendar('clientEvents', function(ev) {
                if( ev == event) {
                    return false;
                }
                var estart = new Date(ev.start);
                var eend = new Date(ev.end);

                return (
                    ( Math.round(start) > Math.round(estart) && Math.round(start) < Math.round(eend) )
                    ||
                    ( Math.round(end) > Math.round(estart) && Math.round(end) < Math.round(eend) )
                    ||
                    ( Math.round(start) < Math.round(estart) && Math.round(end) > Math.round(eend) )
                );
            });
            if (overlap.length){
                revertFunc();
                return false;
            }
        }

【讨论】:

    【解决方案4】:

    在事件对象overlap:false 中添加自定义属性,例如您的事件对象将是

                     `{
                        title:'Event',
                        start: '2017-01-04T16:30:00',
                        end: '2017-01-04T16:40:00',
                        overlap:false
                      }`
    

    现在覆盖 selectOverlap 函数,

    selectOverlap: function(event) {
        if(event.ranges && event.ranges.length >0) {
          return (event.ranges.filter(function(range){
              return (event.start.isBefore(range.end) &&
                      event.end.isAfter(range.start));
          }).length)>0;
        }
        else {
          return !!event && event.overlap;
        }
      },
    

    它不会让另一个事件覆盖已经放置的事件。

    【讨论】:

      【解决方案5】:

      这可以解决问题。它还处理调整重叠事件的大小

      var calendar = new Calendar(calendarEl, {
            selectOverlap: false,
            eventOverlap: false
        }
      });
      

      【讨论】:

        猜你喜欢
        • 2011-07-01
        • 2023-04-03
        • 1970-01-01
        • 2018-07-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-12
        • 2011-06-29
        相关资源
        最近更新 更多