FullCalendar дата окончания равна нулю, когда событие не изменяется, даже если в течение всего дня false - PullRequest
3 голосов
/ 28 сентября 2019

Кто-нибудь знает, почему конечная дата равна нулю в этих событиях "allday = false"?

Пример скрипта: https://jsfiddle.net/L1g0z3jd/

Я создаю его экземпляр, отличный от даты начала, показываетпросто отлично в представлении календаря, но по какой-то причине я не могу понять, когда получаю clientEvents, даже если я не изменил его, я получаю нулевое значение в дате окончания события!

PS: Просто дляРади "совести" я должен добавить ... Я использую и старую версию google chrome (v 57.0.2987.133 64-bit) и старую версию ubuntu (Linux Mint 18.1 Serena)

Это меня достаетпсих!Спасибо!

HTML код:

<button onclick="javascript:getEvents()">Get Events</button>
<div id='calendar'></div>

Javascript код:

$(function() {
$('#calendar').fullCalendar({
    header: false,
    allDaySlot: false,
    visibleRange: {start: moment('2000-01-02'), end: moment('2000-01-09')},
    editable: true,
    selectable: true,
    views: {
        settimana: {
            type: 'agenda',
            columnFormat: 'ddd',
            hiddenDays: []
        }
    },
    defaultView: 'settimana',
    defaultDate: $.fullCalendar.moment().startOf('week'),
    slotMinutes: 30,
    events: [
                $.fn.getAgendaWorktime(1, "08:00:00", 60),
                $.fn.getAgendaWorktime(2, "08:30:00", 120),
            ],
    select: function(startDate, endDate) {
        $('#calendar').fullCalendar('renderEvent', {
            title: 'free time',
            start: startDate.format(),
            end: endDate.format(),
            allDay: false
        });
    },
    eventClick: function(calEvent, jsEvent, view) {
        console.log(calEvent, jsEvent, view);
        if(doubleClick==calEvent._id){
            if (confirm('Delete it?')) {
                $('#calendar').fullCalendar('removeEvents',calEvent._id);
            }
            doubleClick = null;
        }else{
            doubleClick=calEvent._id;
        }
    },
});
});
function getEvents() {
    var e=0,err=false,$data = []
    $('#calendar').fullCalendar('clientEvents').forEach(periodo => {
        if (periodo.end==null || periodo.start.format().substr(0,10)!=periodo.end.format().substr(0,10)) {
            if (e==0) {
                err = true;
                e++;
                alert('Event startint at '+periodo.start.format()+' cant spread to multiple days');
            }
        } else {
            $data.push({'ini': periodo.start.format(), 'fim': periodo.end.format()});
        }
    });
    alert($data);
}

jQuery.fn.getAgendaWorktime = function ($dow, $start, $elapsed) {
    var r = {
        allDay: false,
        title: 'free time',
        start: new Date('2000-01-02 '+$start),
        end: new Date('2000-01-02 '+$start)
    };
    r.start.setDate(r.start.getDate()+$dow);
    r.end.setDate(r.end.getDate()+$dow);
    r.end.setHours(r.end.setHours()+($elapsed*60));
    return(r);
}

1 Ответ

2 голосов
/ 30 сентября 2019

Я выяснил, как решить вопрос, я отвечу на него здесь, так как я не нашел никакого обходного пути или дальнейшего анализа проблемы в Интернете ....

Я не проверял свойпроблема в том, чтобы определить, было ли это конкретно связано с тем, что я неправильно устанавливал время окончания события, и календарь не давал мне никаких ошибок по этому вопросу или что-то еще, но если вы идете по той же дороге, я пошелмогу сказать вам:

  1. Проверьте, правильно ли создано время окончания (что швы, по-моему, является настоящей ошибкой, я использовал setHours вместо getHours в функции getAgendaWorktime, которая превратила окончательное значение вбыть недействительным. Я исправил его в приведенном ниже примере, но допустил неверное отображение в скрипте, чтобы показать использование атрибута forceEventDuration);
  2. Установите для параметра forceEventDuration значение «true» (что приводит к «концу»)атрибут, который всегда должен быть заполнен, облегчая мой код, поскольку я всегда могу ожидать строку из метода ".format ()" attibute);

по многим причинам fullcalendar.io иногда не устанавливает дату окончания события, и это вызывало у меня проблемы при оценке времени окончания события (хорошо, я мог обойти это, но язаинтригованный тем, почему он получал мне те результаты, когда это не могло, и answare был ошибочным кодом).С помощью «forceEventDuration: true» fullcalendar каждый раз для меня давал время окончания, и я мог обнаружить, что используемый мной метод ввода неправильно устанавливал дату окончания, а также давал мне возможность исправить его.

Ссылкиrelated:

Я надеюсь, что этот ответ мог бы помочь новичкам в fullcalendar.io as me.

Образец скриптовой части JavaScript, исправленный:

$(function() {
$('#calendar').fullCalendar({
    header: false,
    allDaySlot: false,
    forceEventDuration: true,
    visibleRange: {start: moment('2000-01-02'), end: moment('2000-01-09')},
    editable: true,
    selectable: true,
    views: {
        settimana: {
            type: 'agenda',
            columnFormat: 'ddd',
            hiddenDays: []
        }
    },
    defaultView: 'settimana',
    defaultDate: $.fullCalendar.moment().startOf('week'),
    slotMinutes: 30,
    events: [
                $.fn.getAgendaWorktime(1, "08:00:00", 60),
                $.fn.getAgendaWorktime(2, "08:30:00", 120),
            ],
    select: function(startDate, endDate) {
        $('#calendar').fullCalendar('renderEvent', {
            title: 'free time',
            start: startDate.format(),
            end: endDate.format(),
            allDay: false
        });
    },
    eventClick: function(calEvent, jsEvent, view) {
        console.log(calEvent, jsEvent, view);
        if(doubleClick==calEvent._id){
            if (confirm('Delete it?')) {
                $('#calendar').fullCalendar('removeEvents',calEvent._id);
            }
            doubleClick = null;
        }else{
            doubleClick=calEvent._id;
        }
    },
});
});
function getEvents() {
    var e=0,err=false,$data = []
    $('#calendar').fullCalendar('clientEvents').forEach(periodo => {
        if (periodo.end==null || periodo.start.format().substr(0,10)!=periodo.end.format().substr(0,10)) {
            if (e==0) {
                err = true;
                e++;
                alert('Event startint at '+periodo.start.format()+' cant spread to multiple days');
            }
        } else {
            $data.push({'ini': periodo.start.format(), 'fim': periodo.end.format()});
        }
    });
    alert($data[0].fim);
}

jQuery.fn.getAgendaWorktime = function ($dow, $start, $elapsed) {
    var r = {
        allDay: false,
        title: 'free time',
        start: new Date('2000-01-02 '+$start),
        end: new Date('2000-01-02 '+$start)
    };
    r.start.setDate(r.start.getDate()+$dow);
    r.end.setDate(r.end.getDate()+$dow);
    r.end.setHours(r.end.getHours()+($elapsed*60));
    return(r);
}
...