fullCalendar无法传递自定义sdate参数至后端?求解决方案
解决fullCalendar传递当月首日参数的问题
我明白你遇到的困扰了——你想把当月首日作为sdate参数传给后端,但现在POST请求里只有fullCalendar自动添加的start(视图可见区间的首日)和end,完全看不到你定义的sdate。这是因为你原来的data是静态对象,只会在日历初始化时计算一次,后续切换视图或月份时的请求根本不会更新这个值。
问题根源拆解
当你把data写成静态对象时,sdate: $("#calendar_1").fullCalendar('getView').intervalStart这行代码只在页面加载、日历首次初始化时执行一次。之后不管你怎么切换月份、切换到周/日视图,fullCalendar发送请求时都会沿用这个初始值,而且它还会自动追加当前视图的start和end参数,导致你预期的sdate根本没被正确传递。
解决方案:把data改成动态函数
要实现每次请求都传递当前视图对应的当月首日,你需要把data从静态对象改成返回参数对象的函数。这样每次fullCalendar发送事件请求时,都会执行这个函数,动态计算最新的参数值。
修改后的完整代码如下:
$('#calendar_1').fullCalendar({ header : { left : 'prev,next today', center : 'title', right : 'month,agendaWeek,agendaDay' }, defaultView : 'month', eventSources: [ { url: 'holidays.php', type: 'POST', // 将data改为函数,动态生成请求参数 data : function() { // 获取当前视图的起始日期 const viewStart = $("#calendar_1").fullCalendar('getView').intervalStart; // 计算当前视图对应的当月第一天(依赖fullCalendar内置的moment.js) const firstDayOfMonth = viewStart.clone().startOf('month'); return { sdate: firstDayOfMonth.format('YYYY-MM-DD'), common: 'Common' }; }, error: function() { alert('there was an error while fetching events!'); }, color: 'yellow', textColor: 'black' } ], eventRender : function(event, element, view) { const date = event.start.format("YYYY-MM-DD"); $(view.el[0]).find(`.fc-day[data-date=${date}]`).css('background-color','#FAA732'); } });
关键细节说明
- 动态计算当月首日:用
viewStart.clone().startOf('month')可以基于当前视图的起始日期,快速得到对应月份的第一天(fullCalendar内置了moment.js,直接用就行)。 - 函数式data的优势:每次请求都会触发这个函数,确保
sdate始终是当前视图对应的月份第一天,不管你是切换月份、切换到周视图还是日视图。 - 关于默认的start/end参数:fullCalendar还是会自动把这两个参数加到请求里,但这不影响你自定义的
sdate,后端可以正常获取到sdate的值。
现在再用print_r($_POST)查看,就能看到包含sdate(当月首日)、common,以及fullCalendar自动添加的start和end参数了。
内容的提问来源于stack exchange,提问作者vishwas jadav
相关产品推荐
相关产品推荐

