我继承维护的一个应用程序在尝试为Fullcalendar渲染加载事件JSON流时超时。
我希望我能得到批准,投入更多的计算资源来解决这个问题,但除此之外,我很难弄清楚如何解决这个问题。
我的一个想法是将数据请求分成更小的部分,一次请求1周的数据(而不是1个月)。
这似乎是可行的,但我不知道如何捕捉时间框架的变化,将其分割成更小的块,然后从中发出多个请求,而不是一个。
您似乎在试图绕过主要问题,即为什么会超时由于不知道太多细节,它可能很简单,因为数据库索引或服务器上的其他进程消耗了太多资源。我建议您配置数据库和框架/服务器以解决此问题。
也就是说,你可以做两件事:
-
禁用
month
视图可强制FullCalendar使用agendaWeek
或agendaDay
。类似这样的东西:$('#calendar').fullCalendar({ header: { left: 'prev,next', center: 'title', right: 'agendaWeek,agendaDay' }, defaultView: 'agendaWeek' });
请参见示例。
-
如果您确实需要
month
视图,可以将events
用作函数。您必须计算一个月中每一周的开始和结束日期,然后调用回调。类似这样的东西:$('#calendar').fullCalendar({ events: function(start, end, timezone, callback) { // do this in chunks only when view is month if ($("#calendar").fullCalendar( 'getView' ).name == 'month') { // You'll need to get the start and end day of each week. // The parameters `start` amd `end` relate to the first day of // the month and the last day of the month. // You should get an array of objects, like this var weeks = [ {start: '2014-09-28', end: '2014-10-04'}, {start: '2014-10-05', end: '2014-10-11'}, {start: '2014-10-12', end: '2014-10-18'}, {start: '2014-10-19', end: '2014-10-25'}, {start: '2014-10-26', end: '2014-11-01'} ]; // When you have that: for(var i in weeks) { getEvents(weeks[i].start, weeks[i].end, callback); } } // if its another view, get all events at once else { getEvents(start, end, callback); } } }); function getEvents(start, end, callback) { $.ajax({ url: 'events', dataType: 'json', async: false, data: { start: start, end: end }, success: function(events) { callback(events); } }); }
为了计算一周的开始和结束,你可以看看这个问题:使用jquery和moment js获取下一周的结束和开始,它应该会帮助你。
请注意,我已将
async: false
添加到$.ajax
中,以便一次只有一个请求。还要注意,这段代码适用于FullCalendar2.*。由于您谈论的是一个现有的应用程序,有些事情会有所不同。版本1.*的
events
文档指出签名有点不同:function( start, end, callback ) { }