FullCalendar能否按资源自定义slotDuration?或限制资源选择时长
FullCalendar resourceTimeGridDay 资源时段自定义方案
一、按资源单独设置slotDuration的可行性
FullCalendar目前不支持针对单个资源配置独立的slotDuration,该参数属于全局配置,所有资源列会共享同一时间间隔,无法实现类似businessHours那样的资源级自定义。
二、限制资源选择时长的实现方法
如果全局使用15分钟间隔,针对不同资源设置选择规则是完全可行的。以你提到的场景为例:资源A允许选择15分钟时段,资源B仅允许选择整点开始的60分钟时段,用户选B列非整点时段时自动调整,具体实现步骤如下:
1. 全局基础配置
先设置全局slotDuration为'00:15:00',保证日历显示15分钟间隔的时间槽。
2. 监听选择事件,修正时段
通过select事件拦截用户的选择操作,根据选中的资源ID判断并调整时段:
- 资源A:直接保留用户选择的15分钟时段
- 资源B:将选中的起始时间向下取整到最近整点,结束时间设为整点加60分钟,然后重新选中调整后的时段
3. 处理事件拖拽与调整
为了防止用户通过拖拽现有事件或调整事件时长违反规则,需要监听eventDrop和eventResize事件,强制修正不符合规则的事件。
代码示例
document.addEventListener('DOMContentLoaded', function() { const calendarEl = document.getElementById('calendar'); const calendar = new FullCalendar.Calendar(calendarEl, { schedulerLicenseKey: 'GPL-My-Project-Is-Open-Source', initialView: 'resourceTimeGridDay', slotDuration: '00:15:00', resources: [ { id: 'A', title: '资源A' }, { id: 'B', title: '资源B' } ], select: function(info) { const resourceId = info.resource.id; let start = info.start; let end = info.end; // 资源B强制整点开始,时长60分钟 if (resourceId === 'B') { // 向下取整到最近整点 start.setMinutes(0, 0, 0); end = new Date(start.getTime() + 60 * 60 * 1000); // 替换原选择 calendar.unselect(); calendar.select(start, end, info.resource); } // 此处可添加创建事件的业务逻辑 }, eventDrop: function(info) { if (info.event.extendedProps.resourceId === 'B') { const adjustedStart = new Date(info.event.start); adjustedStart.setMinutes(0, 0, 0); info.event.setStart(adjustedStart); info.event.setEnd(new Date(adjustedStart.getTime() + 60 * 60 * 1000)); } }, eventResize: function(info) { if (info.event.extendedProps.resourceId === 'B') { // 禁止调整时长,强制保持60分钟 const start = info.event.start; info.event.setEnd(new Date(start.getTime() + 60 * 60 * 1000)); } } }); calendar.render(); });
内容的提问来源于stack exchange,提问作者Russell Greenleaf
相关产品推荐
相关产品推荐

