1

您好我正在尝试避免FullCalendar应用程序中的重叠事件。我已经定义了回调,因此它会检查任何重叠事件,并通过相应地更改和调用eventDrop将当前移动的事件移动到重叠事件的末尾,然后调用.event.startevent.end.fullCalendar('updateEvent', event)

这是我的代码,moment调用的是http://momentjs.com/docs/,这是一个用于 javascript 的时间处理工具库,我认为这不是问题的罪魁祸首。如果我评论那些做的行event.start = start; event.end = end,那么一切正常。如果我不这样做,它会以完全相同的方式中断,无论我是否调用updateEvent。发生的情况是:事件确实被移到了前一个事件的末尾,但是如果我稍后尝试将事件向前移动(当天晚些时候到一个空白空间),前一个事件在视觉上会被延长,直到新的开始当前正在修改的事件。

self.collection是一个主干集合,因此仅使用event.start=注释位调用此代码会显示事件重叠,但是如果我刷新页面,则事件会显示在正确的位置(不重叠)

eventDrop: function(event, dayDelta,
                    minuteDelta, allDay,
                    revertFunc, jsEvent, ui, view) {
    var start = moment(event.start);
    var end = moment(event.end);
    var overlap = self.calendar.fullCalendar('clientEvents', function(ev) {
        if( ev == event)
            return false;
        var estart = moment(ev.start);
        var eend = moment(ev.end);
        return estart.unix() < end.unix() && eend.unix() > start.unix();
    });
    if( overlap.length ) {
        overlap = overlap[0];
        var estart = moment(overlap.start);
        var eend = moment(overlap.end);
        var duration = eend - estart;
        start = eend;
        end = start.clone();
        end.add(duration);
        event.start = start.toDate();
        event.end = end.toDate();
        self.calendar.fullCalendar('updateEvent', event);
    }
    event.model.save({start: start.unix(), end: end.unix()});
},
4

2 回答 2

1

好的,找到问题了。

说的那一行

start = eend;

应该

start = eend.clone();

因为将它包装在一个对象moment中不会这样做,它只是保留一个引用,并将新移动事件的start日期设置为与Date overlap.end

于 2013-03-26T20:12:00.817 回答
0

你还有一个错误,持续时间应该是

var duration = end - start;

因为在您的方法中,它会计算重叠事件的持续时间,而不是您刚刚移动的事件

于 2013-03-29T11:57:32.207 回答