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

FullCalendar V6.1.8自定义“show more”链接行为时this指向异常的问题排查

FullCalendar V6.1.8自定义“show more”链接行为时this指向异常的问题排查

首先,我得帮你理清问题的根源:你在windowResize里能用this拿到日历实例,但moreLinkClick里不行,主要有两个核心原因:

  1. 回调上下文绑定逻辑差异:FullCalendar对windowResize这类全局回调做了上下文绑定处理,确保this指向日历实例;但moreLinkClick的执行上下文默认绑定到触发点击的DOM元素(或window,取决于内部实现),所以直接用this拿不到日历对象。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 10:39:35