Фильтрация событий jquery fullcalendar

Есть ли способ динамической фильтрации событий на стороне клиента в fullcalendar? Когда я получаю события с сервера (json_encoded), я назначаю свой собственный параметр school_id каждому событию. После того, как fullcalendar готов, я хочу динамически фильтровать события с помощью «select».

Я добавляю элемент «select» на страницу следующим образом:

<select id='school_selector'>
      <option value='all'>All schools</option>
      <option value='1'>school 1</option>
      <option value='2'>school 2</option>
</select>

И в коде javascript я добавляю:

jQuery("#school_selector").change(function(){
    filter_id = $(this).val();
    if (filter_id != 'all') {
        var events = $('#mycalendar').fullCalendar( 'clientEvents', function(event) {
        if((filter_id == 'all') ) {
            return true;
        }else{
                //what I need to write here to dynamic filter events on calendar?
        });
    }
 });

Но это не работает. Любая помощь будет большой. Спасибо.


person Den Orlov    schedule 10.07.2011    source источник


Ответы (4)


Начиная с версии 2 fullCalendar, вы можете использовать обратный вызов eventRender для выборочной визуализации события. Объедините это с вызовом метода rerenderEvents в обработчике onChange, и ваши события должны автоматически обновляться исходя из выбранного варианта.

$('#mycalendar').fullCalendar({
    events: [
        {
            title: 'Event 1',
            start: '2015-05-01',
            school: '1'
        },
        {
            title: 'Event 2',
            start: '2015-05-02',
            school: '2'
        },
        {
            title: 'Event 3',
            start: '2015-05-03',
            school: '1'
        },
        {
            title: 'Event 4',
            start: '2015-05-04',
            school: '2'
        }
    ],
    eventRender: function eventRender( event, element, view ) {
        return ['all', event.school].indexOf($('#school_selector').val()) >= 0
    }
});

$('#school_selector').on('change',function(){
    $('#mycalendar').fullCalendar('rerenderEvents');
})
  
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/moment.js/2.9.0/moment.min.js"></script>
<script src="http://fullcalendar.io/js/fullcalendar-2.3.1/fullcalendar.min.js"></script>
<link rel="stylesheet" href="http://fullcalendar.io/js/fullcalendar-2.3.1/fullcalendar.min.css" />

<select id="school_selector">
  <option value="all">All</option>
  <option value="1">School 1</option>
  <option value="2">School 2</option>
</select>

<div id="mycalendar"></div>

Выше, если значение SELECT равно 'all' или совпадает со свойством school объекта event, ваша функция eventRender вернет true и событие отобразится. В противном случае он будет пропущен во время рендеринга.

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

person Andy Zarzycki    schedule 01.05.2015
comment
Я тоже боролся с заменой SELECT, и после применения того, что вы написали, это работает! :-) Спасибо - person Jez; 05.05.2015
comment
Отлично, приятно слышать @ 539. Ключевым фактом, который следует вынести из этого примера, является то, что eventRender () фильтрует загруженные (и кэшированные) события до их рендеринга. В результате вам не нужно загружать дополнительные события, чтобы изменить критерии, по которым вы выполняете фильтрацию. И, конечно же, вы можете сделать условие в eventRender () сколь угодно сложным. - person Andy Zarzycki; 06.05.2015

Решение есть. Я надеюсь, что это поможет кому-то другому.

jQuery("#school_selector").change(function(){
    filter_id = $(this).val();
    if (filter_id == 'all') {
        $("#eventwrapper").fadeOut();
        $('#mycalendar').fullCalendar ('removeEvents');
        var start_source1 = {
                type:'POST',
                data: {school_id:'all',filter:'false'},
                url: '../../ajax/calendar/get_high_season_events.php',
                backgroundColor: 'red'
        };
        var start_source2 = {
                type:'POST',
                data: {school_id:'all',filter:'false'},
                url: '../../ajax/calendar/get_middle_season_events.php',
                backgroundColor: 'orange'
        };
        var start_source3 = {
                type:'POST',
                data: {school_id:'all',filter:'false'},
                url: '../../ajax/calendar/get_low_season_events.php',
                backgroundColor: 'green'
        };
        $('#mycalendar').fullCalendar('addEventSource', start_source1);
        $('#mycalendar').fullCalendar('addEventSource', start_source2);
        $('#mycalendar').fullCalendar('addEventSource', start_source3);
    }else{
        $("#eventwrapper").fadeIn();
        $('#mycalendar').fullCalendar ('removeEvents');
        var start_source1 = {
                type:'POST',
                data: {school_id:$("#school_selector").val(),filter:'true'},
                url: '../../ajax/calendar/get_high_season_events.php',
                backgroundColor: 'red'
        };
        var start_source2 = {
                type:'POST',
                data: {school_id:$("#school_selector").val(),filter:'true'},
                url: '../../ajax/calendar/get_middle_season_events.php',
                backgroundColor: 'orange'
        };
        var start_source3 = {
                type:'POST',
                data: {school_id:$("#school_selector").val(),filter:'true'},
                url: '../../ajax/calendar/get_low_season_events.php',
                backgroundColor: 'green'
        };
        $('#mycalendar').fullCalendar('addEventSource', start_source1);
        $('#mycalendar').fullCalendar('addEventSource', start_source2);
        $('#mycalendar').fullCalendar('addEventSource', start_source3);
    }//if
person Den Orlov    schedule 13.07.2011
comment
это не фильтрация на стороне клиента, не так ли ?? после каждого выбора будет вызов ajax для получения отфильтрованных событий, или я что-то упустил? - person Khizar; 13.02.2012
comment
Ден Орлов Я сделал то же, что и вы, но все равно никакого прогресса - person enjal; 20.02.2015

var eventData = {
    type:'POST',
    data: {
    filter1: "",
    filter2: ""
    },
    url: '../../ajax/calendar/get_high_season_events.php',
    backgroundColor: 'red'
};

Вы можете установить объект, а затем вызвать событие обновления. Таким образом, это не будет мерцать на вас.

eventData.data.filter1 = "searchcriteria1";
eventData.data.filter2 = "searchcriteria2";
$.fullcalendar('refetchEvents');

Проверено и доказано.

person Jonny    schedule 01.05.2012

$("#searchbtnfilter").click(function(){

    var valfiltermots=$('#filtermots').val();
    var valfilterpar=$('#filterpar').val();
    var valfiltercategorie=$('#filtercategorie').val();
    var valfilterdate1=$('#filterdate1').val();
    var valfilterdate2=$('#filterdate2').val();
    var valfilterdepdepartevent=$('#filterdepdepartevent').val();
    var valfilterdeparriveevent=$('#filterdeparriveevent').val();

    $('#calendar').fullCalendar('removeEventSources');
    $('#calendar').fullCalendar('refetchEvents');
    var start_source1 = {
            type:'POST',
            data: {filtermots:valfiltermots,filterpar:valfilterpar,filtercategorie:valfiltercategorie,filterdate1:valfilterdate1,filterdate2:valfilterdate2,filterdepdepartevent:valfilterdepdepartevent,filterdeparriveevent: valfilterdeparriveevent},
            url: "<?php echo url_for('agenda/listeevent'); ?>"
    };
    $('#calendar').fullCalendar('addEventSource', start_source1);
});

код нужен

$('#calendar').fullCalendar('refetchEvents');

после

$('#calendar').fullCalendar('removeEventSources');

и добавить новое событие

$('#calendar').fullCalendar('addEventSource', start_source1);
person cm b    schedule 04.03.2020