我正在尝试使用
fullcalendar
库创建一个事件日历并遵循演示external-dragging
,我理解这个概念只是想知道如何执行恢复功能,如果我按取消,放置事件将返回到其原始位置。
我正在使用
sweetalert2
库替换默认的 javascript 警报,下面是我的代码。
$('#calendar').fullCalendar({
header: {
left: 'prev,next today',
center: 'title',
right: 'month'
},
editable: true,
eventConstraint: {
start: moment().format('YYYY-MM-DD'),
end: '2100-01-01' // hard coded goodness unfortunately
},
droppable: true, // this allows things to be dropped onto the calendar
drop: function() {
// is the "remove after drop" checkbox checked?
if ($('#drop-remove').is(':checked')) {
// if so, remove the element from the "Draggable Events" list
$(this).remove();
}
swal({
title: 'Are you sure?',
text: "You want to change this event schedule?",
type: 'warning',
showCancelButton: true,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33',
confirmButtonText: 'Yes, proceed'
}).then(function (result) {
if (result.value) {
swal(
'Success!',
'The event schedule was successfully changed to ',
'success'
)
}else{
revertFunc();
}
})
//end of drop
},
revertFunc();
仅在eventDrop
上可用,但我不知道如何在drop
活动上实现它,任何建议都会很棒
“drop”回调中没有“revertFunc()”。它根本不存在。
我的解决方法(FullCalendar v4)是管理
EventLeave
和 EventReceive
:在第一个中保存原始事件,在第二个中删除新事件并恢复原始事件。
这里有一个简化版本:
// to map original events (event.id => event)
_oldEventsInfo = new Map();
eventLeaveHandler(info) {
_oldEventsInfo.set(info.event.id, info);
}
eventReceiveHandler(info) {
if (/* for any reason cannot be moved */) {
this.revert(info);
} else {
_oldEventsInfo.delete(info.event.id);
}
}
revert(info) {
var oldInfo = _oldEventsInfo.get(info.event.id);
if (oldInfo) {
// build a new event to restore in the original calendar
var oldCalendar = oldInfo.event._calendar;
var restoredEvent = {
id: oldInfo.event.id,
// etc
};
oldCal.addEvent(restoredEvent);
// delete the destination (dragged) event from dest calendar
info.event._calendar.getEventById(info.event.id).remove();
// remove the old event from my saved
_oldEventsInfo.delete(info.event.id);
}
}
在 v5 中,eventDrop 上有一个“恢复”功能。
在 React 中你可以将此回调存储为引用变量
const revertDropEvent = useRef<() => void>();
const handleDropEvent = ({ event, revert }: EventDropArg) => {
revertDropEvent.current = revert;
}
const handleCancelDrop = () => {
if (revertDropEvent.current) revertDropEvent.current();
}
return (
<div>
<FullCalendar
eventDrop={handleDropEvent}
/* ... */
/>
<ConfirmationModal onClose={handleCancelDrop}/>
</div>
带有 React 的 Fullcalendar v6.1.10
如果您想恢复位置,可以使用恢复功能,如文档所述:https://fullcalendar.io/docs/eventDrop
例如。 ...
const handleDropEvent = async (e) => {
try {
const result = await someFunction(e.event);
if (!result) {
e.revert()
}
} catch (error) {
e.revert()
}
}
...
<FullCalendar
..
eventDrop={handleDropEvent}
...
/>