我已设置setInterval来更新我的调度程序。我从JSON格式的服务器获取数据。但是如果我使用json数据,Scheduler没有得到更新,但是如果我放置静态值它可以正常工作。以下是我的代码。
// It doesn't work
setInterval(function() {
$.post('ajax_comet.php',{sectionIds:sectionIds},function (data){
if(data.processing.length>0)
{
for(var i=0;i<data.processing.length;i++)
{
var startdt=data.processing[i].start_interval.split(",");
var endt=data.processing[i].end_interval.split(",");
var month=parseInt(startdt[1])-1;
var start=startdt[0]+","+month+","+startdt[2]+","+startdt[3]+","+startdt[4];
var end=endt[0]+","+month+","+endt[2]+","+endt[3]+","+endt[4];
var section="'"+data.processing[i].section_id+"'";
console.log(start);
console.log(end);
scheduler.addMarkedTimespan({
start_date: new Date(start),
end_date: new Date(end),
css: "inprocess",
sections: {
unit: section
}
});
scheduler.updateView();
}
与静态数据相同的TimeInterval工作正常。
// This works properly.
setInterval(function() {
$.post('ajax_comet.php',{sectionIds:sectionIds},function (data){
if(data.processing.length>0)
{
for(var i=0;i<data.processing.length;i++)
{
var startdt=data.processing[i].start_interval.split(",");
var endt=data.processing[i].end_interval.split(",");
var month=parseInt(startdt[1])-1;
var start=startdt[0]+","+month+","+startdt[2]+","+startdt[3]+","+startdt[4];
var end=endt[0]+","+month+","+endt[2]+","+endt[3]+","+endt[4];
var section="'"+data.processing[i].section_id+"'";
console.log(start);
console.log(end);
scheduler.addMarkedTimespan({
start_date: new Date(2013,11,29,01,00),
end_date: new Date(2013,11,29,01,30),
css: "inprocess",
sections: {
unit: 'a7b6e635-f62f-6f12-020f-52a959d1ca47'
}
});
scheduler.updateView();
}
}
},'json');
}, 5000);
}
},'json');
}, 5000);
答案 0 :(得分:1)
如果它与静态数据一起使用,则意味着动态数据出错或在客户端上被解析错误。
确保日期和部分正确无误。 例如,在此代码中,您从ajax值收集日期字符串并在控制台中检查此字符串:
var start=startdt[0]+","+month+","+startdt[2]+","+startdt[3]+","+startdt[4];
var end=endt[0]+","+month+","+endt[2]+","+endt[3]+","+endt[4];
console.log(start);
console.log(end);
如果检查生成的日期,那将会提供更多信息,并将其传递给调度程序API。
console.log(new Date(start));
console.log(new Date(end));
日期字符串可能有一些非明显错误,导致日期对象无效。
其次,收集日期的代码相当复杂。我建议使用更简单的格式从服务器传输日期(例如使用unix时间戳),或者定义一些辅助函数来解析它们。
仅供参考,调度程序库包含scheduler.date对象,该对象定义了处理日期的方法。 所以你可以像下面这样定义解析函数。这样可以减少拼写错误和意外错误的空间。我不太确定我是否指定了正确的date format,但如果有必要可以更改
var parseDate = scheduler.date.str_to_date("%Y, %m, %d, %H, %i");
var start = parseDate(data.processing[i].start_interval),
end = parseDate(data.processing[i].end_interval);
一个特别可疑的行是您检索该部分的ID:
var section="'"+data.processing[i].section_id+"'";
我认为您在此处为部分ID添加了额外的引号。我的意思是 var section 将等于 “'a7b6e635-f62f-6f12-020f-52a959d1ca47'”,在静态代码中使用“a7b6e635-f62f-6f12-020f-52a959d1ca47” - 无需额外报价
还有一件事。每次添加时间跨度时,都会调用 scheduler.updateView()。由于此命令会触发完整的日历重绘,因此最好在循环结束时只调用一次。
<强>更新强>
这是代码示例。实际上没有运行它,但我希望它澄清上面的文字
setInterval(function() {
var parseDate = scheduler.date.str_to_date("%Y, %m, %d, %H, %i");// parse string of specified format into date object
$.post('ajax_comet.php',{sectionIds:sectionIds},function (data){
if(data.processing.length>0)
{
for(var i=0;i<data.processing.length;i++)
{
var timespan = data.processing[i];
var start = parseDate(timespan.start_interval),
end = parseDate(timespan.end_interval),
section = timespan.section_id;
console.log(start);
console.log(end);
scheduler.addMarkedTimespan({
start_date: start,
end_date: end,
css: "inprocess",
sections: {
unit: section
}
});
}
//update calendar after loop is finished
scheduler.updateView();
}
},'json');
}, 5000);