编辑全天 fullCalendar 事件将其转换为非 allDay 事件

Editing all day fullCalendar event converts it to a non allDay event

当我编辑全天活动时,fullCalendar (2.0.2) 将其转换为 non-all 天活动。在日历视图中单击事件时,我会加载一个允许用户编辑详细信息的模式。选择 allDay 或时间不是其中的一部分,但日期是。单击提交后,我触发一个 AJAX 调用,该调用更新事件 server-side 然后 returns JSON 包含事件 ID 的数据。然后我查询 fullCalendar 以获得正确的事件。此时allDay_allDay都还是true:

theEvent = $('#calendar').fullCalendar('clientEvents', data.id)[0];
> theEvent.allDay
true
> theEvent._allDay
true

然后我用编辑后的事件更新 fullCalendar object:

calendar.fullCalendar('updateEvent', theEvent);

编辑完成后,事件将显示在日历中,12a 显示在事件标题之前。

我能够追踪到 fullCalendar 中的 mutateEvent 函数,它似乎在以下条件下覆盖了我的设置:

// current values are:
// event.allDay: true
// oldAllDay: true
// newStart: Moment object - Mon Jan 19 2015 00:00:00 GMT-0600 (CST)
// newEnd: null

// detect new allDay
if (event.allDay != oldAllDay) { // if value has changed, use it
    newAllDay = event.allDay;
} else { // otherwise, see if any of the new dates are allDay
    newAllDay = !(newStart || newEnd).hasTime();
}

我不认为我做错了什么,但我不能确定。有人对此有意见吗?请和谢谢。目前我无法升级到更新的版本,因为这个版本 (2.0.2) 似乎与我的客户选择的 Ace Admin Bootstrap 主题有些关联。

或者,我希望能够只允许全天活动,这样我以后就不用担心了。

虽然这并没有真正解决问题,但这个答案解决了我的问题。

只需将 fullCalendar timeFormat 属性 设置为 ''。就我而言,我只有一整天的活动,所以我永远不需要时间。

http://fullcalendar.io/docs/text/timeFormat/

$('#calendar').fullCalendar({
    events: [
        {
            title:  'My Event',
            start:  '2010-01-01T14:30:00',
            allDay: false
        }
        // other events here...
    ],
    timeFormat: ''
});

这似乎是一个错误,已在更高版本中修复。最新版本does it differently.

当您更改开始或结束日期 并且更改的日期有一个时间 时,它会设置 allDay=false。问题重现here.

解决方案非常简单,当事件是全天时,删除 start/end 的时间部分。无论如何它都不应该在那里。

var fcEvent = $('#calendar').fullCalendar("clientEvents",id)[0]; //get the event

// Change the start date and turn it into a string, stripping off the time.
fcEvent.start = moment().format("YYYY-MM-DD"); 

$('#calendar').fullCalendar("updateEvent",fcEvent);

JSFiddle Demo

让它成为有条件的,if(fcEvent.allDay),它应该可以在不破坏其他功能的情况下解决问题。