Несколько виджетов fullacalendar - синхронизированные изменения вида
У меня есть панель управления, где люди могут разместить несколько виджетов fullcalendar (представьте панель управления командой с виджетом fullcalendar для каждого человека в команде). Основная проблема с этим является производительность. Один клиент имеет 16 таких виджетов (все они полны событий), и их количество не ограничено.
Только первый календарь имеет элементы управления заголовком (другие скрыты с помощью CSS).
Что мне нужно, это распространить изменения для просмотра (переключатель basicWeek
в month
так далее.), firstDay
(сегодня в basicWeek
Понедельник везде) и дата (prev
, next
, today
) из первого календаря в другие календари.
Проблема в производительности. Поскольку я действительно не нашел способ, как это сделать (это не выглядело бы очень глупо), кроме как в viewRender
, который вызывается для каждого изменения. Это означает, что если вы переключитесь с basicWeek
в agendaWeek
первый календарь распространяет firstDay
на другие календари (который вызывает viewRender
) и после этого распространяет изменение представления, которое в основном повторно отображает все календари (кроме первого) дважды.
Есть ли способ распространять эти изменения и вручную вызывать рендеринг в других календарях (из того, что я вижу в исходном коде, их может не быть), или лучший способ сделать это? Я также думаю о том, чтобы просто уничтожить календари и заново инициализировать их новыми опциями, но это может привести к перепрошивке (вместо довольно большой задержки, вызванной многократным повторным рендерингом). Один из вариантов, о котором я подумал, - это использование моих собственных кнопок (или повторное использование кнопок по умолчанию, просто освобождающих от них исходные события), но даже в этом случае мне все равно приходилось бы повторно визуализировать календари несколько раз.
Переключение просмотра с 6 почти пустыми календарями занимает около 3 секунд, что недопустимо.
Вот так мой viewRender
код выглядит так (это внутри собственной функции fullcalendar, поэтому каждый виджет имеет свою область видимости с кэшированными переменными и настройками)
viewRender: function(view) {
console.log('viewRender', calendarid, lastView, view.type);
// Propagate all changes from first calendar to other calendars on the page
if ($('#' + calendarid).parents('.widgetCalendar').is(':first-child')) {
// Change the first day (basicWeek is always today, other views are always Monday)
if (view.type != 'basicWeek' && currFirstDay != 1) {
currFirstDay = 1;
$('.calendarDiv').fullCalendar('option', 'firstDay', 1);
return;
} else if (view.type == 'basicWeek' && currFirstDay != firstday) {
currFirstDay = firstday;
$('.calendarDiv').fullCalendar('option', 'firstDay', firstday);
return;
}
// Propagate the view change to other calendars
if (lastView != view.type) {
lastView = view.type;
$('.calendarDiv:not(#' + calendarid + ')').fullCalendar('changeView', view.type); // , view.intervalStart.valueOf());
}
// Propagate the date change to other calendars
if (lastDate != view.intervalStart.valueOf()) {
lastDate = view.intervalStart.valueOf();
$('.calendarDiv:not(#' + calendarid + ')').fullCalendar('gotoDate', view.intervalStart.valueOf());
}
}
},
Ps.: Сначала я думал, что это проблема в основном ajax-запросов для получения новых событий, но я изменил это на функцию, которая использует одиночный вызов и кэширует результаты. Основной причиной, по которой я думал, были некоторые задержки между ajax и тем, что они не были параллельными (блокировка сеанса). Но изменение его на новую функцию показывает, что проблема действительно заключается в повторных визуализациях, которые занимают много времени в календаре (около 250 - 350 мс).
Если какая-либо информация отсутствует, спросите в комментариях, и я обновлю вопрос.
Полная версия календаря: 3.4.0