FullCalendar V6.1.8自定义“show more”链接行为时this指向异常的问题排查
FullCalendar V6.1.8自定义“show more”链接行为时this指向异常的问题排查
首先,我得帮你理清问题的根源:你在windowResize里能用this拿到日历实例,但moreLinkClick里不行,主要有两个核心原因:
- 回调上下文绑定逻辑差异:FullCalendar对
windowResize这类全局回调做了上下文绑定处理,确保this指向日历实例;但moreLinkClick的执行上下文默认绑定到触发点击的DOM元素(或window,取决于内部实现),所以直接用this拿不到日历对象。 - bind时机错误:你尝试用
.bind(guCalendar)的时候,guCalendar变量还没被赋值(它是后面new GuFullCalendar.GuCalendar才创建的),相当于绑定了undefined,自然无效。
解决方法(两种可选)
方法一:利用回调参数里的日历实例(最推荐)
FullCalendar的moreLinkClick回调会传入一个info对象,里面包含calendar属性,直接指向当前的日历实例!完全不需要依赖this,直接用这个参数操作即可。
修改你的moreLinkClick代码如下:
moreLinkClick: function(info) { // 直接通过info.calendar访问日历实例 info.calendar.setOption('dayMaxEvents', Infinity); // 设为Infinity可显示所有事件 }
这样既解决了this指向问题,又能直接实现你要的“在日历内显示所有槽位”的需求(设置dayMaxEvents: Infinity后,不会再出现“show more”按钮,所有事件都会直接展示)。
方法二:用闭包保存日历实例
如果你习惯用this风格的写法,可以先把日历实例存到变量里,再通过闭包在回调中引用:
$(document).bind("jFormEvents.init", function (e, online) { var calendarDiv = $("div.Content.calendar"); var recapPage = $("h3.validationPage"); if ($(calendarDiv).length && !$(recapPage).length) { // ... 其他变量定义 ... let guCalendar; // 先声明变量占位 guCalendar = new GuFullCalendar.GuCalendar(calendarDiv.get(0), { // ... 其他配置项 ... moreLinkClick: function() { guCalendar.setOption('dayMaxEvents', Infinity); // 直接引用闭包里的日历实例 }, // ... 其他配置项 ... }); guCalendar.render(); } });
这种方式利用JavaScript闭包特性,确保回调能访问到已经创建好的日历实例。
额外提示
你的需求是替换默认的模态框展示,改成在日历内显示所有事件,除了修改moreLinkClick,还可以补充:
- 保留
dayMaxEvents初始值为5(或你需要的默认数量),点击“show more”后再改成Infinity,实现“展开全部”的效果; - 自定义
moreLinkClick后,FullCalendar会自动跳过默认的模态框逻辑,无需额外添加阻止默认行为的代码。
备注:内容来源于stack exchange,提问作者Hajji Achref
相关产品推荐
相关产品推荐

