"Uncaught TypeError: Cannot read property 'clone' of undefined" when adding recurring events to database
"Uncaught TypeError: Cannot read property 'clone' of undefined" when adding recurring events to database
出于某种原因,当我尝试使用 $('#calendar').fullCalendar('updateEvent' 更新日历时,出现“"Uncaught TypeError: Cannot read property 'clone' of undefined" ,events[i]); 在我的 ajax 的成功调用中(检查最后的代码片段)
这是我函数调用的结构:
我在 eventReceive 函数中调用 addEventSource,因此当一个元素被拖到日历时,它会被删除并添加重复事件:
eventReceive : function(event) {
...
$('#calendar').fullCalendar('removeEvents', event._id);
$('#calendar').fullCalendar( 'addEventSource',function(start, end, status, callback) {
在 addEventSource 中,我只是检查事件被删除的星期几,并为同一天接下来的几天复制它:
$('#calendar').fullCalendar( 'addEventSource',function(start, end, status, callback) {
var start_date = event.start.toDate();
var stop_date = new Date("2017-01-15"); // for testing purposes to avoid filling up database with too many entries
var events = [];
...
for (loop = start_date.getTime(); (loop <= end._d.getTime()) && (loop <= stop_date); loop = loop + (24 * 60 * 60 * 1000)) {
...
var test_date = new Date(loop);
var momentOfDate = moment(test_date);
var formattedStart = momentOfDate.format("YYYY-MM-DDTHH:mm:ss");
...
if (test_date.getDay() == event.start.weekday()) {
events.push({
title: event.title,
start: formattedStart,
end: // same procedure for end as start
parent_id : // some variable
id: // some unique variable,
tDuration : event.tDuration,
dow : ''
});
} //if
} // for loop
callback(events);
回调后,我们想将新创建的事件添加到数据库中。这很好用,我添加的每个重复事件都在数据库中,如果我排除“$('#calendar').fullCalendar('updateEvent',events[i]);”函数调用,但随后我需要重新加载页面,以便在我移动事件时更新数据库。这是 ajax 调用:
for (i = 0 ; i < events.length-1 ; i++) {
var duration = events[i].tDuration;
$.ajax({
url: 'process.php',
data: 'type=new&title='+events[i].title+'&startdate='+events[i].start+'&duration='+duration+'&enddate='+events[i].end+'&dow='+events[i].dow,
type: 'POST',
dataType: 'json',
success: function(response){
//location.reload(); WORKS but requires reload
$('#calendar').fullCalendar('updateEvent',events[i]); // generates typeError but needed in order modify recurring events
},
error: function(e){
alert('error');
console.log(e.responseText);
}
})
}
遇到这种情况我该怎么办?我可以毫无问题地添加单个事件并执行相同版本的 ajax 而不会出现任何错误,当我尝试访问我自己的 'events' 数组中的事件而不是使用作为eventReceive 函数调用中的参数。但是,由于我要添加多个事件,所以我有点被迫按照我正在做的方式去做。
个人活动代码(有效!):
eventReceive : function(event) {
var title = event.title;
var start = event.start.format();
var end = event.end.format();
var duration = event.tDuration;
var dow ='';
$.ajax({
url: 'process.php',
data: 'type=new&title='+title+'&startdate='+start+'&duration='+duration+'&enddate='+end+'&dow='+dow,
type: 'POST',
dataType: 'json',
success: function(response){
event.id = response.eventid;
$('#calendar').fullCalendar('updateEvent',event);
},
error: function(e){
alert('error');
console.log(e.responseText);
}
});
删除了 attempt1 cus 我自己找到了一个有效的解决方案
当您调用 updateEvent 时,事件必须是事件的原始事件对象,而不仅仅是重建的对象。
因此您要么必须获取原始事件并更新其属性,然后调用 updateEvent,要么您可以调用 removeEvents passing the id and then call renderEvent 从您的数组传递事件。
所以我为此苦苦挣扎了一段时间,终于找到了最佳解决方案。对于重复发生的事件,不要使用 addEventSource 函数,它会在回调函数中造成太多混乱。只需创建一个 for 循环,为事件定义一个新的 varr 并添加属性,使用 $('#calendar').fullCalendar('renderEvent',event,true) 将事件添加到日历中,使其保持不变,然后使用 ajax() 调用以将事件添加到数据库,因此当您刷新它时它会保留。
id_mix = 0;
// TRAVERSE THROUGH TIME
for (loop = start_date.getTime(); (loop <= stop_date); loop = loop + (24 * 60 * 60 * 1000))
...
if (test_date.getDay() == event.start.day()) { // LOOK FOR DAY TO RECUR ON
var myEvent = { // CREATE EVENT
title: event.title,
start: // formatted start date
id : id_mix
}
id_mix++;
$.ajax({
url: 'process.php',
data: 'type=newR&title='+myEvent.title,
type: 'POST',
dataType: 'json',
async: false,
success: function(response){
new_id = response.eventid;
},
error: function(e){
alert('error');
console.log(e.responseText);
}
});
myEvent.id = new_id; // GET ID FROM DATABASE, USE ASYNC = FALSE TO RETREIVE VALUE
$('#calendar').fullCalendar('renderEvent',myEvent,true) // STICK TRUE IN CASE YOU SWAP VIEW
...
出于某种原因,当我尝试使用 $('#calendar').fullCalendar('updateEvent' 更新日历时,出现“"Uncaught TypeError: Cannot read property 'clone' of undefined" ,events[i]); 在我的 ajax 的成功调用中(检查最后的代码片段)
这是我函数调用的结构:
我在 eventReceive 函数中调用 addEventSource,因此当一个元素被拖到日历时,它会被删除并添加重复事件:
eventReceive : function(event) {
...
$('#calendar').fullCalendar('removeEvents', event._id);
$('#calendar').fullCalendar( 'addEventSource',function(start, end, status, callback) {
在 addEventSource 中,我只是检查事件被删除的星期几,并为同一天接下来的几天复制它:
$('#calendar').fullCalendar( 'addEventSource',function(start, end, status, callback) {
var start_date = event.start.toDate();
var stop_date = new Date("2017-01-15"); // for testing purposes to avoid filling up database with too many entries
var events = [];
...
for (loop = start_date.getTime(); (loop <= end._d.getTime()) && (loop <= stop_date); loop = loop + (24 * 60 * 60 * 1000)) {
...
var test_date = new Date(loop);
var momentOfDate = moment(test_date);
var formattedStart = momentOfDate.format("YYYY-MM-DDTHH:mm:ss");
...
if (test_date.getDay() == event.start.weekday()) {
events.push({
title: event.title,
start: formattedStart,
end: // same procedure for end as start
parent_id : // some variable
id: // some unique variable,
tDuration : event.tDuration,
dow : ''
});
} //if
} // for loop
callback(events);
回调后,我们想将新创建的事件添加到数据库中。这很好用,我添加的每个重复事件都在数据库中,如果我排除“$('#calendar').fullCalendar('updateEvent',events[i]);”函数调用,但随后我需要重新加载页面,以便在我移动事件时更新数据库。这是 ajax 调用:
for (i = 0 ; i < events.length-1 ; i++) {
var duration = events[i].tDuration;
$.ajax({
url: 'process.php',
data: 'type=new&title='+events[i].title+'&startdate='+events[i].start+'&duration='+duration+'&enddate='+events[i].end+'&dow='+events[i].dow,
type: 'POST',
dataType: 'json',
success: function(response){
//location.reload(); WORKS but requires reload
$('#calendar').fullCalendar('updateEvent',events[i]); // generates typeError but needed in order modify recurring events
},
error: function(e){
alert('error');
console.log(e.responseText);
}
})
}
遇到这种情况我该怎么办?我可以毫无问题地添加单个事件并执行相同版本的 ajax 而不会出现任何错误,当我尝试访问我自己的 'events' 数组中的事件而不是使用作为eventReceive 函数调用中的参数。但是,由于我要添加多个事件,所以我有点被迫按照我正在做的方式去做。
个人活动代码(有效!):
eventReceive : function(event) {
var title = event.title;
var start = event.start.format();
var end = event.end.format();
var duration = event.tDuration;
var dow ='';
$.ajax({
url: 'process.php',
data: 'type=new&title='+title+'&startdate='+start+'&duration='+duration+'&enddate='+end+'&dow='+dow,
type: 'POST',
dataType: 'json',
success: function(response){
event.id = response.eventid;
$('#calendar').fullCalendar('updateEvent',event);
},
error: function(e){
alert('error');
console.log(e.responseText);
}
});
删除了 attempt1 cus 我自己找到了一个有效的解决方案
当您调用 updateEvent 时,事件必须是事件的原始事件对象,而不仅仅是重建的对象。
因此您要么必须获取原始事件并更新其属性,然后调用 updateEvent,要么您可以调用 removeEvents passing the id and then call renderEvent 从您的数组传递事件。
所以我为此苦苦挣扎了一段时间,终于找到了最佳解决方案。对于重复发生的事件,不要使用 addEventSource 函数,它会在回调函数中造成太多混乱。只需创建一个 for 循环,为事件定义一个新的 varr 并添加属性,使用 $('#calendar').fullCalendar('renderEvent',event,true) 将事件添加到日历中,使其保持不变,然后使用 ajax() 调用以将事件添加到数据库,因此当您刷新它时它会保留。
id_mix = 0;
// TRAVERSE THROUGH TIME
for (loop = start_date.getTime(); (loop <= stop_date); loop = loop + (24 * 60 * 60 * 1000))
...
if (test_date.getDay() == event.start.day()) { // LOOK FOR DAY TO RECUR ON
var myEvent = { // CREATE EVENT
title: event.title,
start: // formatted start date
id : id_mix
}
id_mix++;
$.ajax({
url: 'process.php',
data: 'type=newR&title='+myEvent.title,
type: 'POST',
dataType: 'json',
async: false,
success: function(response){
new_id = response.eventid;
},
error: function(e){
alert('error');
console.log(e.responseText);
}
});
myEvent.id = new_id; // GET ID FROM DATABASE, USE ASYNC = FALSE TO RETREIVE VALUE
$('#calendar').fullCalendar('renderEvent',myEvent,true) // STICK TRUE IN CASE YOU SWAP VIEW
...