2016-10-26 2 views
2

Мне было интересно, был ли способ использования полного календаря для отображения/скрытия элементов на основе классаName этого события.Есть ли способ переключить видимость событий на основе классаName FullCalendar

Точная ситуация у меня есть флажок (скажем #daytimeEvent), и я хотел бы, чтобы переключить видимость события Хтат имеет класс дневное время в массиве ....

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

Вот мой текущий код:

$('#daytimeEvent').on('change', function(){ 
    if ($(this).is(':checked')) 
    { 
     // That part doesn't work 
     calendar.fullCalendar('renderEvent'); 
    } 
    else 
    { 
     // This seems to destroy the event without having the opportunity to toggle the visibility back after 
     calendar.fullCalendar('removeEvents', function(event){ 
     return $.inArray('daytime', event.className) 
     }); 
    } 
} 

Я подполз Google и кажется, что я m не единственный человек с этой проблемой, но я не мог найти решение.

+1

Есть несколько ответов на stackoverflow http://stackoverflow.com/a/36851477/5360631, http://stackoverflow.com/a/33635079/5360631, которые используют флажки для фильтрации. Они не используют имена классов, но должны быть легко адаптированы для этого. – smcd

ответ

0

Я нашел решение (спасибо @smcd за ссылку). Хороший способ сделать это в методе eventRender вашего календаря. Я положил мою логику там, а затем сделал это:

$('#myCalendar').fullCalendar({ 
    // your init [...] then 
    eventRender: function(event, element) { 
      // Array that will store accepted classes 
      var eventAcceptedClasses = []; 
      if ($('.daytime-events-checkbox').is(':checked')){ 
       eventAcceptedClasses.push('daytime-events'); 
      } 
      if ($('.nighttime-events-checkbox').is(':checked')){ 
       eventAcceptedClasses.push('nighttime-events'); 
      } 
      displayEvent = false; 
      event.className.forEach(function(element){ 
       if ($.inArray(element, eventAcceptedClasses) != -1){ 
        displayEvent = true; 
       } 
      }); 
      return displayEvent; 
     } 
}); 

Затем вещи нужно сделать, это просто использовать метод rerenderEvents в прослушивателя событий, как это ниже.

$('.events-filter-checkbox').on('change', function(){ 
    calendar.fullCalendar('rerenderEvents'); 
}); 

Вы не можете скрывать и показывать событие по требованию, но вы можете сделать рендер достаточно гибким и быстрым.

0

Одна ошибка у вас есть то, как вы проверяете для класса существования:

$.inArray('.daytime', event.className) 

Там нет строки .daytime внутри className, вы должны проверить daytime вместо (без .):

$.inArray('daytime', event.className) 
+0

Было бы лучше и было бы работать для удаления, но не было способа переключить их на повторное появление после ... –

+0

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

+0

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

Смежные вопросы