FullCalendar jQuery, повторять каждый понедельник?

Обычно это событие в календаре:

            {

                title: 'Test',

                start: '2012-06-08',

                end: '2012-06-08',

                url: 'test/test'

            },

Прекрасно работает. Хотя как я могу сделать 1 событие, которое отображается в каждый понедельник в календаре? Или каждый вторник и т.д. Зависят от того, какой день недели/номер вы вводите? Каков параметр, если он существует?

Если он не существует, могу ли я каким-то образом изменить и добавить функцию, чтобы это произошло? Таким образом, вы можете ввести параметр, например repeatEveryWeekDay: 2 (который находится в понедельник), а затем во все будущие понедельники данные покажут там.

Я пробовал искать http://arshaw.com/fullcalendar/docs/event_data/Event_Object/, но ничего не нашел.

Ответ 1

fullCalendar позволяет вместо передачи массива событий вы можете передать функцию, которая, например, загружает события с сервера или динамически генерирует эти события.

В большинстве примеров в документации используются HTTP-запросы для получения данных о событиях. Но функция обратного вызова все еще достаточно гибкая, чтобы заставить ее работать так, как вы хотите.

Посмотрите на следующий пример, который я только что написал для вас:

$(document).ready(function() {

    var date = new Date();
    var d = date.getDate();
    var m = date.getMonth();
    var y = date.getFullYear();

    $('#calendar').fullCalendar({
        header: {
            left: 'prev,next today',
            center: 'title',
            right: 'month,agendaWeek,agendaDay'
        },
        editable: true,
        events: [
            // some original fullCalendar examples
            {
                title: 'All Day Event',
                start: new Date(y, m, 1)
            },
            {
                title: 'Long Event',
                start: new Date(y, m, d-5),
                end: new Date(y, m, d-2)
            },
            {
                id: 999,
                title: 'Repeating Event',
                start: new Date(y, m, d-3, 16, 0),
                allDay: false
            }
        ]
    });

    // adding a every monday and wednesday events:
    $('#calendar').fullCalendar( 'addEventSource',        
        function(start, end, callback) {
            // When requested, dynamically generate virtual
            // events for every monday and wednesday.
            var events = [];

            for (loop = start.getTime();
                 loop <= end.getTime();
                 loop = loop + (24 * 60 * 60 * 1000)) {

                var test_date = new Date(loop);

                if (test_date.is().monday()) {
                    // we're in Moday, create the event
                    events.push({
                        title: 'I hate mondays - Garfield',
                        start: test_date
                    });
                }

                if (test_date.is().wednesday()) {
                    // we're in Wednesday, create the Wednesday event
                    events.push({
                        title: 'It\ the middle of the week!',
                        start: test_date
                    });
                }
            } // for loop

            // return events generated
            callback( events );
        }
    );
});

Вышеуказанная функция автоматически генерирует событие для каждого понедельника и среды между двумя датами. Даты указаны в параметрах start и end. Эти параметры передаются fullCallendar. События, генерируемые указанной выше функцией, возвращаются в fullCallendar через функцию callback в третьем параметре.

Я использую DateJS, чтобы проверить, установлена ​​ли данная дата в понедельник.

UPDATE. Если вы хотите смешивать статические события и/или [более одного] повторяемого события, вы можете использовать addEventSource.

Ответ 2

Небольшое обновление к сообщению Кристофера Рамиреса. Используя fullCalendar в v2.2.3 и momentjs в v2.8.4, вам нужно изменить пару строк в фрагменте выше, чтобы заставить его работать:

Во-первых:

function(start, end, callback) {}

к

function(start, end, status, callback) {}

поскольку третий параметр является логическим, а четвертый - функцией обратного вызова

Тогда:

for (loop = start.getTime();
     loop <= end.getTime();
...

к

for (loop = start._d.getTime();
     loop <= end._d.getTime();

поскольку начальный и конечный объекты, переданные функции, не являются объектами Date, а вызов .getTime() на них заканчивается в 'Undefined не является ошибкой функции.

И вот оно! Эти поправки сделали это для меня.

Ответ 3

Это поле идентификатора объекта события, которое определяет повторяемость этого события. Используйте один и тот же идентификатор для всех повторяющихся событий в течение определенного дня недели.

Ответ 4

Лучший способ найти повторное событие - настроить вызов JSON на ваш внутренний язык (я использую Django/Python).

поэтому в параметрах календаря я бы:

события: {url: '/event-data', cache: false},

Затем в моем бэкенде я использую параметры, которые отправляются для текущего отображаемого календаря 'start' и 'end' URL GET. То есть:.

hxxp://example.com: 8000/событий начала данных = 2014-09-28 & конец = 2014-11-09 & _ = 1413553318353

a Запрос запроса будет отправлен из параметров событий, затем я создаю события из базы данных/исходного файла, в котором перечислены события повторения, а также регулярные события календаря и отправляются обратно только список событий, происходящих в этом диапазоне дат в JSON список.