FullCalendar показать больше ссылок не во временном порядке

В FullCalendar с помощью

eventLimit: 2

Ограничивает количество событий, отображаемых в представлении месяца, до двух в день. Затем добавляется ссылка «Показать больше», которая открывает небольшое всплывающее окно, показывающее все события. В представлении месяца события отображаются в порядке времени, но в представлении «Популярное шоу» они упорядочены по идентификатору события. Как я могу упорядочить их по времени во всплывающем окне?

http://jsfiddle.net/obsoyuL0/


person user4370541    schedule 17.01.2015    source источник
comment
Если заказ осуществляется по идентификатору, почему вы не можете просто переупорядочить свои идентификаторы?   -  person Ian Clark    schedule 17.01.2015
comment
В jsfiddle события хранятся в массиве, но в моем реальном приложении они возвращаются из базы данных. Каждый идентификатор является ключом для данных в базе данных, поэтому, если кто-то добавит событие с более ранним временем после более позднего, оно будет иметь больший идентификатор и нарушит порядок.   -  person user4370541    schedule 17.01.2015


Ответы (1)


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

// fullcalendar.js
// A cmp function for determining which segments should take visual priority
// DOES NOT WORK ON INVERTED BACKGROUND EVENTS because they have no eventStartMS/eventDurationMS
function compareSegs(seg1, seg2) {
    return seg1.eventStartMS - seg2.eventStartMS || // earlier events go first
        seg2.eventDurationMS - seg1.eventDurationMS || // tie? longer events go first
        seg2.event.allDay - seg1.event.allDay || // tie? put all-day events first (booleans cast to 0/1)
        (seg1.event.title || '').localeCompare(seg2.event.title); // tie? alphabetically by title
}

Во всяком случае, по поводу этого был открыт запрос о проблеме/функции.

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

function compare(a, b) {
  if (moment(a.start).isSame(b.start)) {
    return 0;
  }
  if (moment(a.start).isBefore(b.start)) {
    return -1;
  }

  return 1;
}

events.sort(compare);

for(var i = 0; i<events.length; i++) {
    events[i]['id']=i;
}

Затем передайте упорядоченный массив в fullcalendar, и события должны появиться во всплывающем окне, упорядоченные по времени начала.

Скрипка

person acontell    schedule 17.01.2015
comment
Отличный ответ, если идентификатор не важен, так что спасибо! К сожалению, идентификаторы из событий используются для других функций, поэтому это не идеально. - person user4370541; 17.01.2015
comment
Спасибо, вы можете сохранить идентификатор в другой переменной внутри объекта, например, real_id, и изменить id, чтобы обмануть полный календарь. Затем используйте real_id в остальной части приложения. - person acontell; 17.01.2015