Несколько виджетов 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

0 ответов

Другие вопросы по тегам