为什么jQuery FullCalendar插件会在每个操作上执行ajax请求?

时间:2011-10-14 20:16:17

标签: jquery fullcalendar

我有以下代码来使用jquery FullCalendar插件:

$(function () {
    var dueHotfixEvents = { url: baseUrl + '/Misc/Calendar/GetDueHotfixEvents', color: 'red' };
    var releasedHotfixEvents = { url: baseUrl + '/Misc/Calendar/GetReleasedHotfixEvents', color: 'green' };
    var releasedVersionEvents = { url: baseUrl + '/Misc/Calendar/GetReleasedVersionEvents', color: 'green' };
    var pendingVersionEvents = { url: baseUrl + '/Misc/Calendar/GetPendingReleaseEvents', color: 'blue' };
    var dueTaskEvents = { url: baseUrl + '/Misc/Calendar/GetReleaseTasksDueEvents', color: 'red' };
    var completedTaskEvents = { url: baseUrl + '/Misc/Calendar/GetReleaseTasksCompletedEvents', color: 'blue' };

    $('#calendar').fullCalendar({
        //theme: true,
        eventSources:
        [
            dueHotfixEvents,
            releasedHotfixEvents,
            releasedVersionEvents,
            pendingVersionEvents,
            dueTaskEvents,
            completedTaskEvents
        ]
    });
});

这些会立即检索系统中的所有日期。但是,每当我更改我所在的月份时,它似乎都会重新获取事件源中的所有数据。我不想要这个,因为它已经拥有它需要的所有数据。

文档指出lazyFetching选项设置为true应该可以解决这个问题,但默认情况下它应该设置为true,但无论是lazyFetching: true,还是lazyFetching: false,都没有改变此

如何阻止FullCalendar发出如此多的ajax请求?

1 个答案:

答案 0 :(得分:1)

好吧,我之前正在考虑那样的smth,我想出了两个解决方案。你可以改变fullcalendar插件本身的一些方法(它不是那么难,我实现了一些新的东西,比如在天/插槽/事件等上捕获dblclick事件,但我不建议这个解决方案做任何好的,如果你计划进一步使用fc更新)或使用某种“解决方法”。 此解决方法基于在初始化fullcalendar之前获取事件数组,因此您可以使用定义为事件数组的evensources初始化fc,这将导致fc不会自己从服务器请求任何数据(即使它确实重新获取所有事件源,它也会仍然只获取那些静态数组)。您还可以将此方法与捕获'viewDisplay'回调连接,检查内部是否已经加载了这些数组,如果没有,则从服务器获取它们并通过addEventSource方法添加它们(您可能需要在fc外部使用一些简单的全局标志来存储状态,事件是否已加载)。 看起来像这样:

$(function () {
    var dueHotfixEvents = { url: baseUrl + '/Misc/Calendar/GetDueHotfixEvents', color: 'red' };
    var releasedHotfixEvents = { url: baseUrl + '/Misc/Calendar/GetReleasedHotfixEvents', color: 'green' };
    var releasedVersionEvents = { url: baseUrl + '/Misc/Calendar/GetReleasedVersionEvents', color: 'green' };
    var pendingVersionEvents = { url: baseUrl + '/Misc/Calendar/GetPendingReleaseEvents', color: 'blue' };
    var dueTaskEvents = { url: baseUrl + '/Misc/Calendar/GetReleaseTasksDueEvents', color: 'red' };
    var completedTaskEvents = { url: baseUrl + '/Misc/Calendar/GetReleaseTasksCompletedEvents', color: 'blue' };
    var eventsLoaded = false;

    $('#calendar').fullCalendar({
        //theme: true,
        eventSources:[],
        'viewDisplay': function(v){
            if(!eventsLoaded){
                var $fcEl = $(this);
                $.ajax({
                    url:dueHotfixEvents.url,
                    type:"get",
                    dataType:"json",
                    success:function(response){
                        if(response.length > 0) $fcEl.fullCalendar('addEventSource', {events:response,color:dueHotfixEvents.color});
                    }
                });
                .
                .  //do same for every source defined
                .
                eventsLoaded=true;
            }
        }
    });
});

希望这会对你有所帮助(我想有更好的解决方案,但这个似乎很简单,很容易实现非常快+它很容易包含很多选项来控制,当它适合重新加载事件+它实际上解决了当有定义的在线资源时,我在动态创建事件时不断遇到令人讨厌的双重事件。)