Вы точно не объяснили, что происходит с вашим кодом, но я вижу, что когда вы получаете ответ от вызова AJAX, вы каждый раз добавляете новый источник событий. Я также вижу, что вы никогда не удаляете какой-либо предыдущий источник событий, поэтому вы просто будете получать все больше и больше событий. Я собираюсь предположить, что это проблема, о которой вы спрашиваете.
Но вместо того, чтобы постоянно добавлять / удалять источники событий, было бы проще объявить это как единый источник событий, который можно обновлять и обновлять. Вы должны использовать шаблон «события как функция», описанный здесь в документации , чтобы объявить этот источник.
Вот некоторый пересмотренный код, который будет иметь немного больше смысла:
var calendarEl = document.getElementById('tasks_calendar');
var calendar = new FullCalendar.Calendar(calendarEl, {
eventSources: [
JSON.parse($("input[name=tasks_events]").val()), //static event source
getTasks //pass a reference to a function, so we have a dynamic, updateable event source
]
///....all your other options go here as well....
});
$("input[name*=selected_user]").on('change',function () {
calendar.refetchEvents(); //this will automatically cause the "getTasks" function to run, because it's associated with an event source in the calendar
});
var getTasks = function(fetchInfo, successCallback, failureCallback) { //the input parameters are the ones shown in the fullCalendar documentation
//find the currently selected users
var selectedUsers = [];
$.each($("input[name*='selected_user']:checked"), function(){
selectedUsers.push($(this).val());
});
//run the ajax call
$.ajax({
url: "/admin/get-users-tasks",
type: "POST",
data: {
users: selectedUsers,
},
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
},
success: function (response) {
successCallback(response); //pass the event data to fullCalendar via the provided callback function
},
error: function(response) {
new PNotify({
title: "Opération échoué",
text: response.message,
type: "error"
});
failureCallback(response); //inform fullCalendar of the error via the provided callback function
}
});
}
Некоторые примечания:
1) В этой версии при загрузке календаря он немедленно отправит AJAX-запрос на сервер и попытается получить события. Однако, поскольку флажки не установлены, данные не будут переданы на сервер. Я не знаю, что в данный момент делает ваш серверный код в этой ситуации, или что вы хотите, чтобы он делал. Я думаю, он должен либо вернуть все возможные события, либо ни одного вообще. В любом случае вам нужно убедиться, что серверный код настроен для обработки этой ситуации и вернуть все данные, которые имеют смысл.
2) Я также добавил здесь ваш другой набор событий (взятых из скрытого поля) в качестве источника событий. Нет необходимости добавлять его отдельно через «addEventSource», так как вы добавляете его сразу после загрузки календаря - вы можете просто объявить его в настройках.
3) Я не использовал предоставленные здесь данные fetchInfo
, но в идеале вы должны брать значения начальной и конечной даты из этого объекта и отправлять их на ваш сервер в качестве параметров, а ваш сервер должен использовать их для фильтровать данные и возвращать только те события, даты начала которых находятся между этими двумя датами. Это будет более эффективным, потому что тогда вы будете возвращать только те данные, которые фактически будут отображаться в календаре, а не все задачи, которые пользователь когда-либо выполнял - если вы подумаете об этом, когда ваше приложение использовалось для Через несколько месяцев у них будет много прошлых данных, которые нет смысла загружать каждый раз, так как почти наверняка они не будут просматриваться. (Обратите внимание, что если пользователь переходит к прошлым / будущим датам, а у fullCalendar нет данных о событиях для этих дат, он снова выполнит вызов AJAX и попросит сервер предоставить его. Но если пользователь никогда не просматривает эти даты, это не будет беспокоить, и вы сэкономите некоторую пропускную способность и время обработки.)
См. https://fullcalendar.io/docs/eventSources для документации по настройке источников событий в опциях календаря.