2013-12-20 3 views
2

Чтобы избежать дублирования событий, я использую эту функцию:fullCalendar: как фильтровать по дате в clientEvents?

function isOverlapping(event){ 
    var array = $('#calendar').fullCalendar('clientEvents'); 
    for(i in array){ 
     if(array[i].id != event.id){ 
     if(array[i].allDay || event.allDay){ 
      if(array[i].start.getDate() == event.start.getDate()){ 
      if(array[i].start.getMonth() == event.start.getMonth()){ 
       return true; 
      } 
      } 
     } 
     else{ 
      if(event.end > array[i].start && event.start < array[i].end){ return true;} 
     } 
     } 
    } 
     return false; 
    } 

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

var array = $('#calendar').fullCalendar('clientEvents', function(events){ return (event.start >= view_start && view_end > event.start)}); 

Но это возвращает все события.

Примечание: Я объявил view_start & view_end как глобальные переменные и вычислил их в ViewDisplay так:

view_start = view.visStart; 
view_end = view.visEnd;  

Как я могу получить события, которые видны в текущем виде.

+0

Вы хотите, чтобы показать события определенного диапазона времени, как месяц в месяц? Можете ли вы показать, как вы выбираете свои события? –

+0

Я использую php-файл, чтобы получить события из базы данных mysql и использовать 'json_encode' для возврата json-фида. – Thiru

+0

Итак, вы используете JSON, чтобы добавлять свои события, и все еще нужно долго? Почему вы не фильтруете серверные стороны своих событий, а в вас AJAX-вызов передает параметр, который сообщает серверу, какие типы событий вы хотите? –

ответ

1

В полном календаре нет встроенного фильтра, вы должны сделать это самостоятельно. Единственное, что вы можете сделать, это сделать то, что вы делаете :) ... используя ваши собственные функции фильтрации.

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

Это мой пример:

function getCalendarEvents(filter){ 

     var events = new Array();  
      if(filter == null) 
      { 
       events = calendar.fullCalendar('clientEvents'); 
      } 
      else 
      { 
       events = getEventsByFilter(filter);     
      }   
     return events;     
    } 

фильтра событий Функция:

function getEventsByFilter(filter){   
     var allevents = new Array(); 
     var filterevents = new Array(); 
     allevents = getCalendarEvents(null); 

     for(var j in allevents){ 
      if(allevents[j].eventtype === filter) 
      { 
       filterevents.push(allevents[j]); 
      } 
     }   

     return filterevents; 
    } 
-2

Большинство функций в фильтрах используют fullCalendar.

Эти фильтры могут быть числом и фильтроваться по идентификатору или могут быть функциями, которые возвращают true или false в зависимости от того, что вы фильтруете.

var array = $('#calendar').fullCalendar('clientEvents',function(event) 
    if(event.start > '1111-11-11')return true; 
    else return false; 
); 
1

Проблема с oneliner, которую вы хотели использовать, заключается в том, что event.start на самом деле является объектом. Я был в состоянии использовать что-то подобное, как это:

moment(calEvent.start).format('YYYY-MM-DD') 

Так что для вашего случая попробовать:

var array = $('#calendar').fullCalendar('clientEvents', function(events){ return (moment(events.start).format('YYYY-MM-DD') >= view_start && view_end > moment(events.start).format('YYYY-MM-DD'))}); 
Смежные вопросы