jQuery FullCalendar:如何在下一个和上一个按钮单击时加载事件
我有一个页面,显示未来30天的事件。 当用户单击“下一个月”视图时,或者当超过30天时,用户继续单击“周/日”视图中的“下一个”按钮时,如何刷新日历 如果我在“周”视图中第五次单击“下一步”按钮,我在日历上看不到任何事件,因为我只有4周的事件 我想通过ajax从服务器中提取数据并刷新日历 这是我目前的代码: 在页面加载时,我这样调用:jQuery FullCalendar:如何在下一个和上一个按钮单击时加载事件,fullcalendar,Fullcalendar,我有一个页面,显示未来30天的事件。 当用户单击“下一个月”视图时,或者当超过30天时,用户继续单击“周/日”视图中的“下一个”按钮时,如何刷新日历 如果我在“周”视图中第五次单击“下一步”按钮,我在日历上看不到任何事件,因为我只有4周的事件 我想通过ajax从服务器中提取数据并刷新日历 这是我目前的代码: 在页面加载时,我这样调用: GetFutureMeetingsForTimeSpan(1, 30); function GetFutureMeetingsForTimeSpan(start
GetFutureMeetingsForTimeSpan(1, 30);
function GetFutureMeetingsForTimeSpan(startDaysFromNow, endDaysFromNow) {
var obMtgs;
var xmlHttp = new XMLHttpRequest();
xmlHttp.onreadystatechange = function () {
if (xmlHttp.readyState == 4) {
if (xmlHttp.status == '200') {
try {
var arrMtgs = new Array();
var meetingObjectArray = JSON.parse(xmlHttp.responseText);
var startTime = '', endTime = '';
var yr1 = 0, mo1 = 0, day1 = 0, hr1 = 0, min1 = 0;
var yr2 = 0, mo2 = 0, day2 = 0, hr2 = 0, min2 = 0;
for (var i = 0; i < meetingObjectArray.length; i++) {
obMtgs = new Object();
obMtgs.id = meetingObjectArray[i].ID;
obMtgs.title = meetingObjectArray[i].ExchangeResource.Subject;
obMtgs.start = new Date(yr1, mo1, day1, hr1, min1, 0);
obMtgs.end = new Date(yr2, mo2, day2, hr2, min2, 0);
arrMtgs.push(obMtgs);
}
//populate the calendar with events array
$('#calendar').fullCalendar({
defaultView: 'agendaWeek',
theme: true,
header: {
left: 'prev,next today',
center: 'title',
right: 'month,agendaWeek,agendaDay'
},
disableDragging: true,
disableResizing: true,
editable: true,
events: arrMtgs,
eventRender: function (event,element){
//code removed
},
eventClick: function (calEvent, jsEvent, view) {
//code removed
},
viewDisplay: function (view) {
//code removed
}
});
}
catch (e) {
alert('decode failed! msg=' + e.message);
}
}
else {
alert('Failed to get meetings! status=' + xmlHttp.status);
}
}
}
//load events from server via webservice using ajax
var url = server_part + "/Meeting/Schedule/Future/TimeSpan/";
url += "?startDaysFromNow=" + startDaysFromNow;
url += "&endDaysFromNow=" + endDaysFromNow;
url += "&APIKey=asjdasjdhhksajhd";
xmlHttp.open("GET", url, false);
xmlHttp.setRequestHeader("Accept", "application/json");
xmlHttp.send();
}
getfuturemetingsfortimespan(1,30);
函数GetFutureMeetingsForTimeSpan(startDaysFromNow,endDaysFromNow){
var-obMtgs;
var xmlHttp=new XMLHttpRequest();
xmlHttp.onreadystatechange=函数(){
if(xmlHttp.readyState==4){
如果(xmlHttp.status==“200”){
试试{
var arrMtgs=新数组();
var meetingObjectArray=JSON.parse(xmlHttp.responseText);
var startTime='',endTime='';
变量yr1=0,mo1=0,day1=0,hr1=0,min1=0;
变量yr2=0,mo2=0,day2=0,hr2=0,min2=0;
对于(var i=0;i
发生这种情况是因为您正在使用预设的事件:arrMtgs
初始化cal。
相反,让FC请求它需要的事件,如示例doc:or中所示。
另外,您可以使用jQuery
$执行更简单的ajax请求。在我看来,您从错误的角度处理问题。不要让getfuturemetingsfortimespan
函数每次调用时都重新初始化FC实例,而应该只初始化FC一次,让FC调用getfuturemetingsfortimespan
函数(或其变体)
因此,我建议您在FC实例第一次可见时创建它,并在必要时使用events函数加载事件:
$('#calendar').fullCalendar({
defaultView: 'agendaWeek',
theme: true,
header: {
left: 'prev,next today',
center: 'title',
right: 'month,agendaWeek,agendaDay'
},
disableDragging: true,
disableResizing: true,
editable: true,
events: function(start, end, callback) {
// populate arrMtgs as you're used to
// using the start and end parameters,
// or see MaxD's answer for alternatives
callback(arrMtgs);
},
eventRender: function (event,element){
//code removed
},
eventClick: function (calEvent, jsEvent, view) {
//code removed
},
viewDisplay: function (view) {
//code removed
}
});
我和u有同样的问题,日历的性能非常差。直到我意识到:
fullcalendar返回事件的ajax URL,默认情况下将开始和结束参数与ajax请求关联。这些开始和结束表示每个日历页上显示的事件的第一个日期和最后一个日期(可通过“下一个”和“上一个”箭头更改)。因此,在返回所有事件的事件代码中,可以通过此开始和结束来限制它们。
控制器上的代码可以是:
Event.where(:start_at => DateTime.strptime(params[:start],'%s')..DateTime.strptime(params[:end],'%s'))
现在我正在使用events:function(start,end,callback){}是的,这就是您需要做的。下面的第二个答案只是对同一个解决方案进行了扩展。