我有一个通过完整日历制作的日历.js它具有外部日历事件,您可以通过拖放将其添加到其中。
我的问题是,当我向后移动一个月然后回到我刚刚看到的月份时,事件就会消失。
以下是日历初始化代码:
$('#calendar').fullCalendar({
editable: true,
header: {
left: 'prev,next today',
center: 'title',
right: 'month,agendaWeek'
},
events: //some events
ignoreTimezone: false,
eventDrop: function(event,dayDelta,minuteDelta,allDay,revertFunc){
//do stuff
},
eventResize: function(event,dayDelta,minuteDelta,revertFunc,jsEvent,ui, view) {
//do stuff
},
droppable: true,
drop: function(date, allDay, jsEvent, ui) {
var $this = $(this);
var dropped = $this.data('eventobject');
var dropped2 = $.extend({} , dropped);
dropped2.title = $this.html();
dropped2.start = date;
dropped2.allDay = (dropped.allDay || allDay);
$parent.text(renderDate(date, "MDY", "/"));
$('#calendar').fullCalendar('renderEvent', dropped2, true);
iosocket.emit("calendar", {calEvent: finitise(dropped2)});
$this.remove();
}
});
您会注意到我在渲染事件部分中将"粘性"设置为 true。当这是"假"时,只有新事件在改变月份时消失 - 这是预期的行为。
但是,将粘滞设置为"true"时,所有事件都会消失,无论它们是否在初始集合中。我收到一个控制台错误,说"events[i] 为空",这似乎向我表明日历事件正在超出范围,但我不知道如何。
似乎只在几个月之间滚动时发生;当滚动数周时,一切似乎都很正常,直到你到达一个月的边缘 - 然后再次遇到错误
已修复:问题是 dropped2 事件在渲染后被更改。
finitise 方法删除循环引用(例如,A 有子 B,B 有子 C,C 有子 A)。
我没有意识到(尽管我应该意识到,因为这是finitise方法背后的动机)是渲染事件创建了fullCalendar所需的循环引用。
正如我在渲染后调用 finitise 一样,事件的结构对于更改日历中的月份时自动发生的后续渲染无效。
在renderEvent调用之前调用finitise可以解决此问题,因为renderEvent会将循环引用添加到finitized对象(并且不会导致socketio出现问题,因为finitise对象已经通过iosocket发送)。