无法添加自定义函数组成的数组作为事件源
unable to add an array formed by self-defined function as an event source
我已经使用 AJAX 通过 API 从数据库请求数据。这是 function.Since dB 中的格式与完整日历要求的格式不同,我创建了一个名为 schedule 的对象,它看起来与事件对象相同,用于存储每个事件项。然后将每个对象推送到一个名为 schedules 的数组中。 (如果有人问,reformattingTime() 只是将我从数据库中获取的字符串从 HHMM 更改为 HH:MM:SS 格式)
function getCourse(arr){
$.ajax({
type: "GET",
url: '/course',
success: function(req){
for (var i = 0; i < req.length;i++){
var schedule = {daysOfWeek:[]};
schedule.title = req[i].course_name;
schedule.daysOfWeek = req[i].course_day;
schedule.startTime = reformattingTime(req[i].course_starttime);
schedule.endTime = reformattingTime(req[i].course_endtime);
arr.push(schedule);
}
},
error: function(err){
alert('Error:' + err);
}
}
)
}
here's how schedules[0] looks like
接下来,当我加载页面时,我将日程添加为事件源,然后呈现日历。但是,事件不会出现在日历中。
<script>
var schedules = [];
$(document).ready(function(){
getCourse(schedules);
var calendarEl = document.getElementById('calendar');
var calendar = new FullCalendar.Calendar(calendarEl, {
plugins: ['timeGrid', 'dayGrid', 'interaction', 'list'],
header:{
left: 'timeGridWeek,listMonth'
},
defaultView: 'timeGridWeek',
});
calendar.addEventSource(schedules);
calendar.render();
});
如果我对数组进行硬编码,就可以显示事件。我已经检查过 getCourse() 中的时间表对象是否与我硬编码的相同。
index 0 is hard coded while index 1 is generated from the function. At this situation, only 0 is displayed
<script>
var schedules = [{
title: "A1",
startTime: "18:00:00",
endTime: "20:00:00",
daysOfWeek:['1']
}];
$(document).ready(function(){
getCourse(schedules);
var calendarEl = document.getElementById('calendar');
var calendar = new FullCalendar.Calendar(calendarEl, {
plugins: ['timeGrid', 'dayGrid', 'interaction', 'list'],
header:{
left: 'timeGridWeek,listMonth'
},
defaultView: 'timeGridWeek',
});
calendar.addEventSource(schedules);
calendar.render();
});
您的问题是 AJAX 请求是异步的。这意味着其余代码在请求完成之前继续执行。这意味着当日历被实例化时,你的日程总是空的。因此你需要等到请求完成。所以你必须做如下的事情。我还添加了一些您可以利用 ES6+ 功能的进一步代码改进。
我不知道 API 调用等,所以无法真正测试所有内容,但这是您需要做的。
function getCourse(arr) {
return $.ajax({ // return the promise
type: "GET",
url: '/course'
})
}
function renderCalendar(courseList) {
const calendarEl = document.getElementById('calendar');
const calendar = new FullCalendar.Calendar(calendarEl, {
plugins: ['timeGrid', 'dayGrid', 'interaction', 'list'],
header: {
left: 'timeGridWeek,listMonth'
},
defaultView: 'timeGridWeek',
});
calendar.addEventSource(schedules);
calendar.render();
}
function toCourseModel(course) {
return {
daysOfWeek: [],
title: req[i].course_name,
daysOfWeek: req[i].course_day,
startTime: reformattingTime(req[i].course_starttime),
endTime: reformattingTime(req[i].course_endtime),
}
}
// DOMContentLoaded
// @see https://developer.mozilla.org/en-US/docs/Web/Events/DOMContentLoaded
document.addEventListener('DOMContentLoaded', async (event) => { // ES6+ Native javascript.
console.log('DOM fully loaded and parsed');
const coursesList = await getCourse().catch(console.error) // await till async promise is complete
const transFormed = coursesList.map((course) => { // ES6 Array.map() method
return toCourseModel(course);
});
// Now create the calendar
renderCalendar(transFormed);
});
我已经使用 AJAX 通过 API 从数据库请求数据。这是 function.Since dB 中的格式与完整日历要求的格式不同,我创建了一个名为 schedule 的对象,它看起来与事件对象相同,用于存储每个事件项。然后将每个对象推送到一个名为 schedules 的数组中。 (如果有人问,reformattingTime() 只是将我从数据库中获取的字符串从 HHMM 更改为 HH:MM:SS 格式)
function getCourse(arr){
$.ajax({
type: "GET",
url: '/course',
success: function(req){
for (var i = 0; i < req.length;i++){
var schedule = {daysOfWeek:[]};
schedule.title = req[i].course_name;
schedule.daysOfWeek = req[i].course_day;
schedule.startTime = reformattingTime(req[i].course_starttime);
schedule.endTime = reformattingTime(req[i].course_endtime);
arr.push(schedule);
}
},
error: function(err){
alert('Error:' + err);
}
}
)
}
here's how schedules[0] looks like
接下来,当我加载页面时,我将日程添加为事件源,然后呈现日历。但是,事件不会出现在日历中。
<script>
var schedules = [];
$(document).ready(function(){
getCourse(schedules);
var calendarEl = document.getElementById('calendar');
var calendar = new FullCalendar.Calendar(calendarEl, {
plugins: ['timeGrid', 'dayGrid', 'interaction', 'list'],
header:{
left: 'timeGridWeek,listMonth'
},
defaultView: 'timeGridWeek',
});
calendar.addEventSource(schedules);
calendar.render();
});
如果我对数组进行硬编码,就可以显示事件。我已经检查过 getCourse() 中的时间表对象是否与我硬编码的相同。
index 0 is hard coded while index 1 is generated from the function. At this situation, only 0 is displayed
<script>
var schedules = [{
title: "A1",
startTime: "18:00:00",
endTime: "20:00:00",
daysOfWeek:['1']
}];
$(document).ready(function(){
getCourse(schedules);
var calendarEl = document.getElementById('calendar');
var calendar = new FullCalendar.Calendar(calendarEl, {
plugins: ['timeGrid', 'dayGrid', 'interaction', 'list'],
header:{
left: 'timeGridWeek,listMonth'
},
defaultView: 'timeGridWeek',
});
calendar.addEventSource(schedules);
calendar.render();
});
您的问题是 AJAX 请求是异步的。这意味着其余代码在请求完成之前继续执行。这意味着当日历被实例化时,你的日程总是空的。因此你需要等到请求完成。所以你必须做如下的事情。我还添加了一些您可以利用 ES6+ 功能的进一步代码改进。
我不知道 API 调用等,所以无法真正测试所有内容,但这是您需要做的。
function getCourse(arr) {
return $.ajax({ // return the promise
type: "GET",
url: '/course'
})
}
function renderCalendar(courseList) {
const calendarEl = document.getElementById('calendar');
const calendar = new FullCalendar.Calendar(calendarEl, {
plugins: ['timeGrid', 'dayGrid', 'interaction', 'list'],
header: {
left: 'timeGridWeek,listMonth'
},
defaultView: 'timeGridWeek',
});
calendar.addEventSource(schedules);
calendar.render();
}
function toCourseModel(course) {
return {
daysOfWeek: [],
title: req[i].course_name,
daysOfWeek: req[i].course_day,
startTime: reformattingTime(req[i].course_starttime),
endTime: reformattingTime(req[i].course_endtime),
}
}
// DOMContentLoaded
// @see https://developer.mozilla.org/en-US/docs/Web/Events/DOMContentLoaded
document.addEventListener('DOMContentLoaded', async (event) => { // ES6+ Native javascript.
console.log('DOM fully loaded and parsed');
const coursesList = await getCourse().catch(console.error) // await till async promise is complete
const transFormed = coursesList.map((course) => { // ES6 Array.map() method
return toCourseModel(course);
});
// Now create the calendar
renderCalendar(transFormed);
});