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

如何利用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 09:24:16