fullcalendar - multiple sources to turn off and on

人走茶凉 提交于 2019-12-12 02:45:18

问题


I've a calendar that I want to list various types of event on and enable a checkbox filter to show/hide those kind of events.

Is there a way to say on this action, ONLY load from 1 data-source AND remember that URL on month next/prev links?

I've started using eventSources, but it loads them all, rather than the one(s) I want.. Here's what I have.

    var fcSources = {
    all: {
                url: tournament_url + '/getCalendar/?typefilter=[1,2]'
            },
    type1: {
                url: tournament_url + '/getCalendar/?typefilter=[1]'
            },
    type2: {
                url: tournament_url + '/getCalendar/?typefilter=[2]'
            }
};

These URLS all provide a json string of events, based on the types prrovided.

Here's my calendar:

    $('#calendar').fullCalendar({
    header: {
        left: 'prev,next today',
        center: 'title',
        right: 'month,basicWeek'
    },
    firstDay: 1, // Monday = 1
    defaultDate: new Date(), // Now
    editable: true,
    eventSources: [ fcSources.all ],
    events: fcSources.all,
    nextDayThreshold: '00:00:00',
... etc etc

Above my calendar I have this:

input type="checkbox" name="event_filter[]" value="type1" /> Type 1
input type="checkbox" name="event_filter[]" value="type2" /> Type 2

And finally , two Jquery fucntions.. one to get all the filters:

function getFilters(getName) {
    var filters = [];
    var checked = [];
    $("input[name='"+getName+"[]']").each(function () {
        filters.push( $(this).val() );
    });
    $("input[name='"+getName+"[]']:checked").each(function () {
        checked.push( $(this).val() );
    });
    return [filters, checked];
}

and the last to load them:

    $(".event_filter").on('click', function() {
    var doFilters = getFilters('event_filter');
    $('#calendar').fullCalendar( 'removeEvents' );

    if (doFilters[0] === doFilters[1]) {
        $('#calendar').fullCalendar( 'addEventSource', fcSources.all );
    } else {
        $.each(doFilters[1], function(myFilter, myVal) {
            console.log(myVal);
            $('#calendar').fullCalendar( 'addEventSource', fcSources.myVal );

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

回答1:


Since the sources are all the same place and just different data on the URL, this approach could meet your needs. In the demo it just alerts the URL that is being tried but doesn't actually supply any data...

https://jsfiddle.net/gzbrc2h6/1/

var tournament_url = 'https://www.example.com/'
$('#calendar').fullCalendar({
  events: {
    url: tournament_url + '/getCalendar/',
    data: function() {
      var vals = [];
      // Are the [ and ] needed in the url? If not, remove them here
      // This could (should!) also be set to all input[name='event_filter[]'] val's instead of hard-coded...
      var filterVal = '[1,2]';
      $('input[name="event_filter[]"]:checked').each(function() {
        vals.push($(this).val());
      });
      if (vals.length) {
        filterVal = '[' + vals.join(',') + ']' // Are the [ and ] needed in the url? If not, remove here too
      }
      return {
        typefilter: filterVal
      };
    },
    beforeSend: function(jqXHR, settings) {
      alert(unescape(settings.url));
    }
  }
});

// when they change the checkboxes, refresh calendar
$('input[name="event_filter[]"]').on('change', function() {
  $('#calendar').fullCalendar('refetchEvents');
});



回答2:


Try this!

$('#calendar').fullCalendar({
  events: function( start, end, timezone, callback ) { 
      var checked = [];
        $("input[name='event_filter[]']:checked").each(function () {
          checked.push( $(this).val() );
      });
        var tournament_url = 'https://www.example.com';
        $.ajax({
              url: tournament_url + '/getCalendar/',
              data: {typefilter: '['+checked.join(',')+']'},
              success: function(events) {
                  callback(events);
              }
          });
  }
});

$('input[name="event_filter[]"]').on('change', function() {
  $('#calendar').fullCalendar('refetchEvents');
});

This works for me.



来源:https://stackoverflow.com/questions/35414684/fullcalendar-multiple-sources-to-turn-off-and-on

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!