如何从fullcalendar中删除外部删除的事件?

时间:2017-09-28 15:24:46

标签: javascript jquery fullcalendar fullcalendar-scheduler

我一直在尝试这样做,所以我可以将事件从fullcalendar拖到垃圾箱,而我的代码非常适合初始化日历时呈现的事件,但它似乎无法使用已从外部事件中删除到日历上的事件。

当我将外部事件拖到日历上,然后尝试将它们拖到垃圾箱时,它会删除所有事件。

我看过像this这样的帖子说要使用_id属性,但是当我这样做时,什么都没有删除。

以下是我使用的代码:

eventDragStop: function (event, jsEvent) {

    var trashEl = jQuery('#trashCan');
    var ofs = trashEl.offset();

    var x1 = ofs.left;
    var x2 = ofs.left + trashEl.outerWidth(true);
    var y1 = ofs.top;
    var y2 = ofs.top + trashEl.outerHeight(true);

    if (jsEvent.pageX >= x1 && jsEvent.pageX <= x2 &&
        jsEvent.pageY >= y1 && jsEvent.pageY <= y2) {
        console.log(event);
        $('#calendar').fullCalendar('removeEvents', event._id);
    }
},

传递event.id有效,但event._id,就像我在这里所做的那样,什么也没做。

修改 为了澄清一点,我决定留下所有相关的代码。

这就是我的外部事件。第一个是从我已经工作了大约一年的全日历实例中直接复制的。:

<div id="external-events" class="dropdown col-lg-3">
    <button class="btn btn-default dropdown-toggle" type="button" id="dropdownMenu1"
            data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">
        Unscheduled Events
        <span class="caret"></span>
    </button>
    <ul class="dropdown-menu" aria-labelledby="dropdownMenu1">
        <li class="dropdown-header">Drag events to calendar</li>
        <li class="divider"></li>
        <li><a href="#" data-duration="01:00" data-event='{"id": "803", "title": "Jennifer Ramundo"}' class='menu-event'>My Event 1</a></li>
        <li class="divider"></li>
        <li><a href="#" data-event="{'id': '2'}" class='menu-event'>My Event 2</a></li>
        <li class="divider"></li>
        <li><a href="#" data-event="{'id': '3'}" class='menu-event'>My Event 3</a></li>
    </ul>
</div>

这是我初始化外部事件的方式:

$('#external-events .menu-event').each(function () {

    // store data so the calendar knows to render an event upon drop
    $(this).data('event', {
        title: $.trim($(this).text()), // use the element's text as the event title
        stick: true // maintain when user navigates (see docs on the renderEvent method)
    });

    // make the event draggable using jQuery UI
    $(this).draggable({
        zIndex: 999,
        revert: true,      // will cause the event to go back to its
        revertDuration: 0  //  original position after the drag
    });
});

这是我的掉落功能:

drop: function (date, jsEvent, ui, resourceId) {
    console.log('drop', date.format(), resourceId);
    $(this).parent().next().remove();
    $(this).remove();
    if ($('#external-events').find('.menu-event').length === 0) {
        $('#external-events').hide();
    }
},

1 个答案:

答案 0 :(得分:2)

@ADyson是对的。从您对上述评论的回复:

  

当事件对象出现在日历上时,id似乎也没有显示。

实际上,在发生任何拖动之前,外部元素ID都会丢失。在console.log()迭代中使用$('#external-events .menu-event').each(...)我发现在html中指定的内联数据被JS中应用的新事件数据完全覆盖。

这很奇怪,因为我不知道这是不应该发生的。  来自the jQuery docs

  

在jQuery 1.4.3中,使用.data(obj)设置元素的数据对象,扩展先前使用该元素存储的数据。

(我认为这意味着v1.4.3及更高版本)。在上面误解了这一行后,我意识到文档说你可以使用新元素扩展数据对象,例如:

$('#selector').data('a', stuff);
$('#selector').data('b', otherstuff);

没问题,没有冲突,$('#selector')上的数据现在包含两个元素,以及值stuffotherstuff

但这并不适用于尝试将现有元素与某些新值“合并”,这就是您正在做的事情:

$('#selector').data('a', stuff);
$('#selector').data('a', otherstuff);

在这种情况下,最终结果是a上的数据为otherstuff,而非stuffotherstuff合并。您只是替换a的数据值。事后我很清楚这是显而易见的。

这样做的最终结果是,当您放入日历时,您的所有外部元素都没有id。在没有指定removeEvents will remove all events的情况下拨打id

似乎最好的选择是在一个地方同时指定您的数据 - 全部内联在HTML中,或者全部通过JS动态指定。如果你必须从两者中分配它,解决方案是在迭代项目时正确地将内联数据与新数据合并:

var elData = $(this).data('event'),
newData = {
    title: $.trim($(this).text()),
    stick: true
};
$(this).data('event', $.extend(elData, newData));

请注意,顺序非常重要,关键:newData中的值对将覆盖elData中的匹配键。

通过此更新,我能够让您的代码正常运行。 Here's a working JSFiddle

附注:

  • 您正混合使用jQuery$,至少在eventDragStop()回调中使用。

  • 事件2和3的内联数据的JSON语法不正确。 JSON requires double quotes为其字符串。为了看到这一点,我在JSFiddle中修复了事件2的语法,你可以测试垃圾事件1和2(有效的JSON)是否有效。尝试删除事件3(无效的JSON),并且所有事件都将被删除。