You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FullCalendar v3.4.0:能否重写默认范围过滤器实现自定义事件展示?

解决方案

针对你遇到的这个问题,在FullCalendar 3.4.0中有两种可行的处理方式,其中第一种不需要修改源码,更安全易维护:

方式一:给目标事件添加stick属性(推荐)

FullCalendar 3.x原生支持给事件添加stick: true属性,标记为stick的事件会强制显示在当前视图中,不受默认的时间范围过滤逻辑影响。你可以在API返回事件后,先筛选出「当日+未来10天」的事件,给它们添加这个属性再传给callback:

events: function (start, end, timezone, callback) {
    app.CalendarService.getStoreSpecificCalendar(calendarServiceOptions)
        .done(function (events) {
            const now = moment();
            const tenDaysLater = moment().add(10, 'days');
            // 处理事件:给符合时间范围的事件添加stick属性
            const processedEvents = events.map(event => {
                const eventStart = moment(event.start);
                // 判断事件是否在目标时间范围内
                if (eventStart.isBetween(now, tenDaysLater, null, '[]')) {
                    return { ...event, stick: true };
                }
                return event; // 不在范围内的事件仍遵循默认过滤
            });
            callback(processedEvents);
            console.log(processedEvents); // 可以查看处理后的事件列表
        }).fail(function () {
            window.location.href = errorPageUrl;
        });
}

同时,建议给你的自定义视图cvDay2添加明确的duration配置,确保视图容器有足够的空间展示这些事件:

views: {
    customAgendaWeek: {
        eventLimit: 100,
        duration: { weeks: 1 }
    },
    cvDay2: {
        eventLimit: 100,
        duration: { days: 11 } // 当日+未来10天,共11天的时间范围
    }
},

方式二:重写FullCalendar内部的applyRange方法(不推荐)

如果你一定要彻底替换默认的范围过滤逻辑,可以重写FullCalendar的EventSource.prototype.applyRange方法——这是3.x版本中负责事件范围过滤的核心函数。注意这种方式会影响全局所有视图的过滤逻辑,需要谨慎使用:

// 必须在初始化FullCalendar之前执行这段代码
if (window.FullCalendar && FullCalendar.EventSource) {
    // 先保存原始方法,方便后续需要恢复
    const originalApplyRange = FullCalendar.EventSource.prototype.applyRange;
    
    // 重写过滤逻辑
    FullCalendar.EventSource.prototype.applyRange = function(events, range) {
        const now = moment();
        const tenDaysLater = moment().add(10, 'days');
        // 自定义过滤:只保留当日到未来10天的事件
        return events.filter(event => {
            const eventStart = moment(event.start);
            return eventStart.isBetween(now, tenDaysLater, null, '[]');
        });
        
        // 如果需要针对特定视图生效,可以加判断,例如:
        // if (this.calendar && this.calendar.view.name === 'cvDay2') {
        //     // 自定义逻辑
        // } else {
        //     // 其他视图用原始逻辑
        //     return originalApplyRange.call(this, events, range);
        // }
    };
}

// 之后再初始化你的日历(原有代码不变)
$('#calendar').fullCalendar({
    // 你的配置...
});

内容的提问来源于stack exchange,提问作者Phoenix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:22:27