如何利用Kendo Scheduler组件资源栏的空白区域
结论
完全可以在不覆盖Kendo Scheduler原生逻辑的前提下利用垂直资源分组列的空白区域。直接在资源的text字段插入HTML会被组件默认的XSS防护机制转义为纯文本,属于非官方推荐的错误用法,可通过以下两种兼容原生逻辑的方案实现自定义内容添加:
方案1:使用官方groupHeaderTemplate自定义资源表头内容 (推荐)
该配置是Kendo Scheduler公开的原生扩展点,专门用于定制分组场景下的资源表头渲染逻辑,不会破坏原有的资源关联、搜索筛选、事件绑定等核心功能,版本升级兼容性最好。
你不需要修改原有resources配置的结构,只需要在初始化Scheduler时新增该模板配置即可,模板中可以获取到当前资源的所有字段(包括你自定义扩展的字段),自由拼接需要展示的内容:
$("#scheduler").kendoScheduler({ // 原有date、views、dataSource等配置保持不变 // 原有resources配置无需修改text字段,可直接扩展自定义属性 resources: [ { field: "roomId", name: "Rooms", dataSource: [ { text: "Meeting Room 101", value: 1, color: "#2572c0", capacity: 12 }, { text: "Meeting Room 201", value: 2, color: "#f8a398", capacity: 8 } ], title: "Room" }, { field: "attendees", name: "Attendees", dataSource: [ { text: "Alex", value: 1, department: "研发部" }, { text: "Bob", value: 2, department: "产品部" }, { text: "Charlie", value: 3, department: "设计部" } ], multiple: true, title: "Attendees" } ], // 垂直分组配置保持原有逻辑即可 group: { resources: ["Rooms", "Attendees"], orientation: "vertical" }, // 新增分组表头模板,自定义展示内容 groupHeaderTemplate: function(data) { let extraContent = ''; // 根据资源类型分别渲染不同的自定义内容 if (data.name === 'Rooms') { extraContent = `<div class="res-extra"><span>容纳${data.capacity}人</span></div>`; } else if (data.name === 'Attendees') { extraContent = `<div class="res-extra"><span>${data.department}</span></div>`; } // 保留原生的颜色标记、资源文本结构,不修改这部分就不会破坏原生逻辑 return ` <div class="k-scheduler-group-header-content"> <span class="k-scheduler-mark" style="background-color:${data.color}"></span> <span class="k-resource-text">${data.text}</span> ${extraContent} </div> `; } });
你可以自行编写.res-extra类的CSS样式,控制自定义内容的布局,只要不修改原生元素的类名和核心定位属性,就不会打乱组件原有布局。
方案2:通过dataBound事件注入资源列区域自定义内容
如果需要在资源列除表头外的时间格空白区域添加内容(比如固定操作按钮、状态提示等),可以监听组件的dataBound事件,在组件完成渲染后以追加DOM的方式注入自定义内容,同样不会侵入原生逻辑:
$("#scheduler").kendoScheduler({ // 其他原有配置保持不变 dataBound: function() { // 先移除已注入的自定义内容,避免组件重绘时重复添加 $(".custom-res-column-node").remove(); // 遍历所有垂直分组的资源列单元格 $(".k-scheduler-content .k-group-cell").each(function() { const $cell = $(this); // 获取当前列对应的资源信息,按需生成内容 const currentResText = $cell.closest(".k-scheduler-group-column") .find(".k-resource-text") .last() .text(); // 以追加而非替换的方式插入自定义内容,不破坏原有DOM结构 $cell.append(` <div class="custom-res-column-node"> <button class="k-button k-button-sm k-rounded-md" data-res="${currentResText}">快速建会</button> </div> `); }); } }); // 自定义元素的事件统一用事件委托绑定到Scheduler根节点,避免组件重绘后事件失效 $("#scheduler").on("click", ".custom-res-column-node .k-button", function(e) { e.stopPropagation(); const resName = $(this).data("res"); // 自定义业务逻辑,比如打开新建日程窗口默认选中当前资源 });
注意事项
- 所有自定义操作不要修改组件原生生成的DOM结构、类名、核心样式属性,仅做内容追加即可保证原生拖拽、日程创建、视图切换等功能正常运行
- 自定义样式尽量限定在你自己添加的元素类名范围内,避免污染组件原生样式
- 不要在
dataBound里做复杂的DOM操作,避免组件渲染性能下降
内容的提问来源于stack exchange,提问作者Jaquarh
相关产品推荐
相关产品推荐

