新闻中心

Kendo UI OrgChart 节点内容自定义与数据扩展教程

2025-11-25
浏览次数:
返回列表

Kendo UI OrgChart 节点内容自定义与数据扩展教程

本教程详细介绍了如何利用 kendo ui orgchart 的模板功能,突破默认限制,实现节点内容的深度自定义。通过定义 `template` 属性,开发者可以根据具体业务需求,灵活展示包括多字段数据在内的丰富信息,并移除不必要的元素如头像,从而构建出更具专业性和信息量的组织结构图。

Kendo UI OrgChart 节点内容定制概述

Kendo UI OrgChart 默认提供的节点显示内容通常仅限于“姓名”和“职位”等少量信息。然而,在实际应用中,我们往往需要在一个节点内展示更多关联数据,例如项目指标、成本详情或绩效数据等。Kendo UI 为此提供了强大的模板(template)机制,允许开发者完全自定义每个组织图节点的 HTML 结构和数据绑定方式,从而满足复杂的展示需求。

理解 template 属性

template 属性是 Kendo UI OrgChart 配置对象中的一个关键选项,它接受一个字符串作为值,该字符串定义了每个节点将渲染的 HTML 结构。在这个 HTML 字符串中,我们可以使用 Kendo UI 模板语法 #: fieldName # 来绑定数据源中对应的字段值。

例如,如果您的数据源包含 item_desc、eoy_target、ytd_plan 等字段,您可以在模板中直接引用它们,将这些信息动态地渲染到每个节点中。

定义自定义节点模板

要自定义 OrgChart 节点,您需要根据您的数据结构和希望展示的信息来构建一个 HTML 字符串。以下是一个基于您提供的 JSON 数据,展示多个字段信息的自定义模板示例。

假设我们有如下数据结构:

[
  {
    "item_id": "195",
    "item_desc": "Fuel Cost",
    "parent_pi_kode": "193",
    "parent_pid_desc": "Blasting Cost",
    "eoy_target": 0.2,
    "eoy_actual": 0.32,
    "ytd_plan": 0.13,
    "ytd_actual": 0.14,
    "achi_pi": 107.69,
    "achi_ia": 0.0,
    "achi_ra": 0.0,
    "achi_ip": 0.0,
    "has_child": true,
    "is_expanded": true
  },
  // ... 其他数据项
]

我们的目标是展示 item_desc, eoy_target, eoy_actual, ytd_plan, ytd_actual, achi_pi, achi_ia, achi_ra, achi_ip 这些字段,并且不需要头像。

您可以这样构建您的 template:

$("#orgchart").kendoOrgChart({
    // ... 其他配置
    template:
        "<div class='orgchart-node-custom'>" +
            "<div class='node-header'><strong>#: item_desc #</strong></div>" +
            "<div class='node-body'>" +
                "<p>EOY Target: #: kendo.toString(eoy_target, 'n2') #</p>" +
                "<p>EOY Actual: #: kendo.toString(eoy_actual, 'n2') #</p>" +
                "<p>YTD Plan: #: kendo.toString(ytd_plan, 'n2') #</p>" +
                "<p>YTD Actual: #: kendo.toString(ytd_actual, 'n2') #</p>" +
                "<p>Achi PI: #: kendo.toString(achi_pi, 'n2') #%</p>" +
                "<p>Achi IA: #: kendo.toString(achi_ia, 'n2') #%</p>" +
                "<p>Achi RA: #: kendo.toString(achi_ra, 'n2') #%</p>" +
                "<p>Achi IP: #: kendo.toString(achi_ip, 'n2') #%</p>
                    <div class="aritcle_card">
                        <a class="aritcle_card_img" href="/ai/892">
                            <img src="https://img.php.cn/upload/ai_manual/000/000/000/175679988742423.png" alt="语鲸">
                        </a>
                        <div class="aritcle_card_info">
                            <a href="/ai/892">语鲸</a>
                            <p>AI智能阅读辅助工具</p>
                            <div class="">
                                <img src="/static/images/card_xiazai.png" alt="语鲸">
                                <span>314</span>
                            </div>
                        </div>
                        <a href="/ai/892" class="aritcle_card_btn">
                            <span>查看详情</span>
                            <img src="/static/images/cardxiayige-3.png" alt="语鲸">
                        </a>
                    </div>
                " +
            "</div>" +
        "</div>",
    // ... 其他配置
});

在这个模板中:

  • 我们创建了一个名为 orgchart-node-custom 的主容器 div,用于整体样式控制。
  • node-header 显示了 item_desc 作为节点的标题。
  • node-body 包含了其他所有需要展示的字段,每个字段都用一个

    标签包裹。

  • #: kendo.toString(fieldName, 'n2') # 用于格式化数字,例如保留两位小数,使其更具可读性。

完整示例代码

下面是一个完整的 Kendo UI OrgChart 配置示例,演示了如何集成自定义模板和您提供的数据。

<!DOCTYPE html>
<html>
<head>
    <title>Kendo UI OrgChart 自定义节点</title>
    <link rel="stylesheet" href="https://kendo.cdn.telerik.com/2025.3.1114/styles/kendo.default-v2.min.css" />
    <script src="https://kendo.cdn.telerik.com/2025.3.1114/js/jquery.min.js"></script>
    <script src="https://kendo.cdn.telerik.com/2025.3.1114/js/kendo.all.min.js"></script>
    <style>
        /* 自定义节点样式 */
        .orgchart-node-custom {
            width: 200px; /* 根据内容调整宽度 */
            padding: 10px;
            border: 1px solid #ccc;
            border-radius: 5px;
            background-color: #f9f9f9;
            box-shadow: 2px 2px 5px rgba(0,0,0,0.1);
            text-align: left;
            font-size: 12px;
            line-height: 1.4;
        }
        .orgchart-node-custom .node-header {
            font-size: 14px;
            margin-bottom: 5px;
            color: #333;
            border-bottom: 1px solid #eee;
            padding-bottom: 5px;
        }
        .orgchart-node-custom .node-body p {
            margin: 2px 0;
            color: #555;
        }
    </style>
</head>
<body>
    <div id="orgchart" style="height: 600px; width: 100%;"></div>

    <script>
        $(document).ready(function() {
            var orgChartData = [
                {
                    "item_id": "193",
                    "item_desc": "Blasting Cost",
                    "parent_pi_kode": null, // 根节点没有父级
                    "parent_pid_desc": null,
                    "eoy_target": 0.6,
                    "eoy_actual": 0.96,
                    "ytd_plan": 0.31,
                    "ytd_actual": 0.36,
                    "achi_pi": 116.13,
                    "achi_ia": 0.0,
                    "achi_ra": 0.0,
                    "achi_ip": 0.0,
                    "has_child": true,
                    "is_expanded": true
                },
                {
                    "item_id": "195",
                    "item_desc": "Fuel Cost",
                    "parent_pi_kode": "193",
                    "parent_pid_desc": "Blasting Cost",
                    "eoy_target": 0.2,
                    "eoy_actual": 0.32,
                    "ytd_plan": 0.13,
                    "ytd_actual": 0.14,
                    "achi_pi": 107.69,
                    "achi_ia": 0.0,
                    "achi_ra": 0.0,
                    "achi_ip": 0.0,
                    "has_child": true,
                    "is_expanded": true
                },
                {
                    "item_id": "194",
                    "item_desc": "AN Cost",
                    "parent_pi_kode": "193",
                    "parent_pid_desc": "Blasting Cost",
                    "eoy_target": 0.2,
                    "eoy_actual": 0.32,
                    "ytd_plan": 0.1,
                    "ytd_actual": 0.12,
                    "achi_pi": 120.0,
                    "achi_ia": 0.0,
                    "achi_ra": 0.0,
                    "achi_ip": 0.0,
                    "has_child": true,
                    "is_expanded": true
                },
                {
                    "item_id": "196",
                    "item_desc": "Oil Cost",
                    "parent_pi_kode": "193",
                    "parent_pid_desc": "Blasting Cost",
                    "eoy_target": 0.2,
                    "eoy_actual": 0.32,
                    "ytd_plan": 0.08,
                    "ytd_actual": 0.1,
                    "achi_pi": 125.0,
                    "achi_ia": 0.0,
                    "achi_ra": 0.0,
                    "achi_ip": 0.0,
                    "has_child": true,
                    "is_expanded": true
                }
            ];

            $("#orgchart").kendoOrgChart({
                dataSource: new kendo.data.OrgChartDataSource({
                    data: orgChartData,
                    schema: {
                        model: {
                            id: "item_id",
                            parentId: "parent_pi_kode",
                            fields: {
                                item_id: { type: "string" },
                                parent_pi_kode: { type: "string", nullable: true }
                            },
                            expanded: "is_expanded"
                        }
                    }
                }),
                template:
                    "<div class='orgchart-node-custom'>" +
                        "<div class='node-header'><strong>#: item_desc #</strong></div>" +
                        "<div class='node-body'>" +
                            "<p>EOY Target: #: kendo.toString(eoy_target, 'n2') #</p>" +
                            "<p>EOY Actual: #: kendo.toString(eoy_actual, 'n2') #</p>" +
                            "<p>YTD Plan: #: kendo.toString(ytd_plan, 'n2') #</p>" +
                            "<p>YTD Actual: #: kendo.toString(ytd_actual, 'n2') #</p>" +
                            "<p>Achi PI: #: kendo.toString(achi_pi, 'n2') #%</p>" +
                            "<p>Achi IA: #: kendo.toString(achi_ia, 'n2') #%</p>" +
                            "<p>Achi RA: #: kendo.toString(achi_ra, 'n2') #%</p>" +
                            "<p>Achi IP: #: kendo.toString(achi_ip, 'n2') #%</p>" +
                        "</div>" +
                    "</div>",
                // 如果不需要分组,可以移除 groupField 和 groupHeaderTemplate
                // groupField: "parent_pid_desc",
                // groupHeaderTemplate: "<i> #: field #</i>: <strong>#: value # </strong>",
            });
        });
    </script>
</body>
</html>

代码说明:

  • dataSource 配置: kendo.data.OrgChartDataSource 用于处理层级数据。id 字段指定了每个节点的唯一标识,parentId 字段指定了其父节点的标识。expanded 字段用于控制节点默认是否展开。
  • template 属性: 包含了我们自定义的 HTML 结构和数据绑定表达式。
  • CSS 样式: 示例中提供了一些基本的 CSS 样式,用于美化自定义节点的外观。您可以根据实际需求进一步调整。
  • 数据格式化: 使用 kendo.toString(value, format) 可以对数值进行格式化,例如 n2 表示保留两位小数。

注意事项与最佳实践

  1. CSS 样式的重要性: 自定义模板后,节点的布局和外观完全由您定义的 HTML 和 CSS 控制。务必编写合适的 CSS 样式,以确保节点美观、易读,并适应不同屏幕尺寸。
  2. 数据绑定安全性: Kendo UI 模板会自动进行 HTML 编码,以防止 XSS 攻击。如果您的数据包含需要作为原始 HTML 渲染的内容(不推荐),可以使用 #! field # 语法,但这会带来安全风险,请谨慎使用。
  3. 性能考量: 对于包含大量节点或每个节点内容非常复杂的组织图,过多的 DOM 元素可能会影响渲染性能。在设计模板时,应尽量保持 HTML 结构简洁高效。
  4. 响应式设计: 考虑在不同设备和屏幕尺寸下,自定义节点内容的显示效果。可能需要结合 CSS 媒体查询来实现响应式布局。
  5. 调试: 如果自定义模板不按预期工作,请检查浏览器的开发者工具,查看生成的 HTML 结构和 CSS 样式,通常能帮助定位问题。
  6. Kendo UI 版本兼容性: 确保您使用的 Kendo UI 版本支持 OrgChart 功能,并注意不同版本之间可能存在的 API 差异。

总结

Kendo UI OrgChart 的 template 属性为开发者提供了极大的灵活性,使其能够根据具体业务需求,完全掌控组织图节点的显示内容和样式。通过精心设计的模板,您可以将默认仅展示少量信息的 OrgChart 转换为功能丰富、数据详尽的可视化工具,从而提升用户体验和数据洞察力。掌握这一技巧,将使您在构建复杂的 Kendo UI 应用时如虎添翼。

以上就是Kendo UI OrgChart 节点内容自定义与数据扩展教程的详细内容,更多请关注其它相关文章!


# 哈罗小说网站建设文案  # 绑定  # 是一个  # 在这个  # 不需要  # 两位  # 弹出  # 如何做外贸推广网站  # 甘肃seo推广哪个好用  # 数据结构  # seo推广团队优化  # 页面seo具体设置方法  # 怎么做推广营销好卖东西  # 鸡西律师网站推广  # 营销推广美容院文案范本  # 北京seo公司华网天下  # 监测推广数据的网站有哪些  # css  # 您可以  # 您的  # 自定义  # 数据格式化  # 响应式设计  # 响应式布局  # cdn  # 工具  # 浏览器  # 编码  # node  # json  # js  # html  # jquery 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 汽水音乐车机版8.9下载 汽水音乐车机版8.9版本安装入口  如何将HTML表格多行数据保存到Google Sheets  厨房不锈钢水槽发黑生锈怎么处理_水槽用可乐+锡纸2分钟抛亮如新  漫画星球免费下拉式入口 漫画星球免费漫画在线阅读网站  win11 arm版怎么安装 M1/M2 Mac虚拟机安装ARM win11的方法  漫蛙漫画登录站点 漫蛙2正版漫画快速访问  抖音隐秘迷城小游戏入口_ 抖音冒险解谜小游戏秒玩  C#使用XPath查询节点时出错? 常见语法错误与调试技巧  uc手机浏览器网页版入口 uc浏览器手机版便捷登录首页  蓝湖怎样用切图标注提对接效率_蓝湖用切图标注提对接效率【设计对接】  从J*aScript对象中精确提取指定属性的教程  蛙漫官网漫画入口地址_蛙漫在线畅读无广告弹窗  MAC怎么安装Homebrew包管理器_MAC为开发者和高级用户安装命令行工具  星露谷物语官网入口 星露谷物语游戏官网入口  如何使用 Excel 发布器与 Power BI 分享 Excel 洞察  J*aScript:在map操作中高效处理空数组  在J*a中如何开发简易电子商务商品管理系统_商品管理系统项目实战解析  AO3官方在线访问地址 Archive of Our Own最新镜像合集  中兴BladeV30怎样用测距估书架层高_iPhone中兴BladeV30测距估书架层高【家装参考】  学习通网页版官方登录 超星学习通电脑端入口指南  4399免费游戏网址入口 4399小游戏免费入口点开即玩  Lar*el如何正确地在控制器和模型之间分配逻辑_Lar*el代码职责分离与架构建议  期待已久:小米17 Ultra、小米首款NAS本月登场  AO3官方可用镜像 Archive of Our Own网页版最新入口  在FastAPI中利用lifespan与依赖注入高效管理Redis连接池  搜狗浏览器如何使用密码生成器创建强密码 搜狗浏览器内置密码安全工具  Golang如何通过reflect获取匿名字段方法_Golang reflect匿名字段方法访问技巧  利用5118提升短视频内容效果_5118短视频关键词优化方法  PDO预处理语句中冒号的正确处理:区分SQL函数格式与命名占位符  响应式图片在网页设计中的正确实现方法  MinIO大规模对象列表性能瓶颈深度解析与外部元数据管理策略  小红书商家版怎样在笔记嵌入商品卡路径_小红书商家版在笔记嵌入商品卡路径【挂载教程】  Android Studio计算器C键功能异常排查与修复教程  Golang如何使用new_Go new分配内存机制讲解  文心一言怎样用插件调度API数据_文心一言用插件调度API数据【API调用】  Tabulator表格日期时间排序问题及自定义解决方案  C++如何生成随机数_C++ random库使用方法与范围设置  Go与Ruby之间实现AES加密互通:CFB模式下的密钥长度匹配策略  Win10如何清理注册表垃圾 Win10手动清理无效注册表【技巧】  抖音从哪里进入网页版_抖音官方入口链接  FullCalendar 自定义按钮样式定制指南  AI泡沫首次被“刺破”:GPU十年都无法存活!  浏览器打开即用 美图秀秀网页版入口  在Runstone环境中高效处理TasteDive API的JSON数据  J*aScriptWebpack优化_J*aScript构建工具实战  快手网页版在线登录 快手网页版官网入口快速访问  PHP 枚举:根据字符串获取枚举案例的策略与实现  css滚动区域卡顿如何改善_css滚动问题用will-change优化渲染  Archive of Our Own官网直达 AO3最新可用地址一览  163邮箱官方主页登录 直达网易邮箱登录核心页面 

搜索