防止呈现在给定日期之前发生的事件

时间:2016-10-25 23:24:00

标签: javascript jquery fullcalendar

我正在尝试删除在某个开始日期之前的完整日历上的所有事件(假设开始日期是2016年10月17日)。

以下是我的代码:

$("#calendar").fullCalendar('removeEvents', function(eventObject) {
    //return true if the event 'eventObject' needs to be removed, return false if it doesn't
    if (moment(eventObject.start).isBefore(start_date)) {
        return true;
    }
});

因此,在加载页面时,10月17日至2016年10月17日之前的所有事件都将消失。但是,如果我导航到下个月(即11月),然后导航回到10月,所有被删除的事件都会突然回来!

如何使其在初始化时保持删除开始日期之前的事件。我是否需要将此脚本包装在每月发生更改时触发的事件中?

1 个答案:

答案 0 :(得分:1)

有几种方法可以做到。

  1. 如果您对此有所控制,请在后端执行此操作。这是最好的选择,因为您将在服务器端过滤事件,请求响应会更小,并且不需要进行javascript处理。

  2. 您可以使用events as a function和"操纵"在请求中发送的日期,因此如果开始日期在您需要的日期之前,您只需更新发送到服务器的参数。像这样:

    var startDate = moment("17-10-2016", "DD-MM-YYYY");
    
    $('#calendar').fullCalendar({
        // use events as a function instead of a json feed
        events: function(start, end, timezone, callback) {
            // Before the request to the server, check if the `start` param is before `startDate`
            // then the parameter will be the startDate.
            // This way the server would return the events after that date
            // Beware: you might need to tweak the end parameter as well
            var startParam = start.isBefore(startDate) ? startDate : start;
    
            $.ajax({
                url: '/fullcalendar/events18',
                dataType: 'json',
                data: {
                    start: startParam.format('YYYY-MM-DD'),
                    end: end.format('YYYY-MM-DD')
                },
                success: function(data) {
                    callback(data.sourcename);
                }
            });
        }
    });
    
  3. 根据smcd对其评论的建议,您可以使用eventRender删除在您想要的日期之前发生的事件。类似的东西:

    var startDate = moment("17-10-2016", "DD-MM-YYYY");
    
    $('#calendar').fullCalendar({
        events: '/fullcalendar/events18',
        eventRender: function(event, element) {
        // if the start date of the event occured before `startDate`, return false and don't render the event
            if (event.start.isBefore(startDate)) {
                return false;
            }
        }
    });
    

    选中working fiddle