Fullcalendar 4.0 事件中的多个过滤器使用

Multiple filters usage in Fullcalendar 4.0 events

$('#mycalendar').fullCalendar({
  defaultDate: '2015-05-01',
  events: [{
      title: 'Event 1',
      start: '2015-05-01',
      school: '10',
      college: '1'
    },
    {
      title: 'Event 2',
      start: '2015-05-02',
      school: '2',
      college: '1'
    },
    {
      title: 'Event 3',
      start: '2015-05-03',
      school: '1',
      college: '1'
    },
    {
      title: 'Event 4',
      start: '2015-05-04',
      school: '2',
      college: '2'
    }
  ],
  eventRender: function eventRender(event, element, view) {

    if ($('#currentAction').val() == 'school') {
      if ($('#school_selector').val() != 'all')
        return ['all', event.school].indexOf($('#school_selector').val()) >= 0
    }

    if ($('#currentAction').val() == 'college') {
      if ($('#college_selector').val() != 'all')
        return ['all', event.college].indexOf($('#college_selector').val()) >= 0
    }
  }
});

$('#school_selector').on('change', function() {
  $('#currentAction').val('school');
  $('#mycalendar').fullCalendar('rerenderEvents');
})
$('#college_selector').on('change', function() {
  $('#currentAction').val('college');
  $('#mycalendar').fullCalendar('rerenderEvents');
})
<head>

  <link rel='stylesheet' href='https://fullcalendar.io/js/fullcalendar-3.1.0/fullcalendar.min.css' />
</head>

<body>
  <div id='calendar'></div>

  <script src='https://fullcalendar.io/js/fullcalendar-3.1.0/lib/moment.min.js'></script>
  <script src='https://fullcalendar.io/js/fullcalendar-3.1.0/lib/jquery.min.js'></script>
  <script src='https://fullcalendar.io/js/fullcalendar-3.1.0/lib/jquery-ui.min.js'></script>
  <script src='https://fullcalendar.io/js/fullcalendar-3.1.0/fullcalendar.min.js'></script>



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

  <div id="mycalendar"></div>
  <span id="currentAction" name="currentAction" />

我有多个过滤器要应用于全日历事件。 过滤器一是 'Status',过滤器二是 'NAME'。 当我使用 eventrender 中的逻辑应用 'Status' 过滤器时,月视图仅显示选定的 'Status' 事件,当我尝试将第二个过滤器 'NAME' 与 eventrender 中的其他逻辑块一起应用时,它考虑月视图中的所有事件,而不考虑第一个 'Status' 过滤器结果。 这样做的原因是因为我在 eventrender 中为第一个 'Status' 过滤器编写代码,如果任何事件的状态与我选择的 'Status' 不匹配,我只是返回 false,所以我没有应用任何从日历中隐藏或删除事件,这可能是 fullcalendar 认为所有事件都对后续过滤有效的原因。 请提出建议。

我认为这就是您的目标。您可以通过选择 School 2,然后在 College 1 和 2(以及 All)之间切换并观察显示和隐藏哪些事件来对其进行最佳测试。

您的问题是“current_action”变量,它导致一次只有一个过滤器 运行。 eventRender 中的其他 if 语句也是一个问题,因为它们也会阻止 indexOf 查询(包含“all”选项)返回有用的结果。

通过消除所有干扰来简化它后,您可以将两个 indexOf 查询的结果结合起来,并且只显示满足两个条件的事件(即它们满足两个下拉列表设置的条件)。

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

$('#school_selector').on('change', function() {
  $('#mycalendar').fullCalendar('rerenderEvents');
})
$('#college_selector').on('change', function() {
  $('#mycalendar').fullCalendar('rerenderEvents');
})
<head>

  <link rel='stylesheet' href='https://fullcalendar.io/js/fullcalendar-3.1.0/fullcalendar.min.css' />
</head>

<body>
  <div id='calendar'></div>

  <script src='https://fullcalendar.io/js/fullcalendar-3.1.0/lib/moment.min.js'></script>
  <script src='https://fullcalendar.io/js/fullcalendar-3.1.0/lib/jquery.min.js'></script>
  <script src='https://fullcalendar.io/js/fullcalendar-3.1.0/lib/jquery-ui.min.js'></script>
  <script src='https://fullcalendar.io/js/fullcalendar-3.1.0/fullcalendar.min.js'></script>



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

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