提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
翻译|使用教程|编辑:莫成敏|2020-06-22 14:55:58.947|阅读 1605 次
概述:在本教程中,我们将向您展示如何指定左侧网格的列,并为您简要概述dhtmlxGantt中的模板化和格式设置功能。
# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>
相关链接:
dhtmlxGantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的所有需求,是最完善的甘特图图表库。它允许你创建动态甘特图,并以一个方便的图形化方式可视化项目进度。有了dhtmlxGantt,你可以显示活动之间的依赖关系,显示具有完成百分比阴影的当前任务状态以及组织活动到树结构。
在本教程中,我们将向您展示如何指定左侧网格的列,并为您简要概述dhtmlxGantt中的模板化和格式设置功能,您可以观看视频教程或阅读文章内容:
甘特图中的网格列指定为“列”配置内的对象数组。
典型的配置如下所示:
gantt.config.columns = [ {name: "text", tree: true, width: '*', resize: true}, {name: "start_date", align: "center", resize: true}, {name: "duration", align: "center"}, {name: "add", width: 44} ];
实际上,即使您未在应用中指定此设置,这也是默认情况下将具有的配置。
列具有很多可选属性。要知道的重要一点是,只有'name'属性是强制性的。其主要目的是定义单元格的内容。默认情况下,单元格将从任务的match属性中获取值:
document.addEventListener("DOMContentLoaded", function(event) { gantt.config.columns = [ {name: "text", tree: true, width: '*', resize: true}, {name: "start_date", align: "center", resize: true}, {name: "duration", align: "center"}, {name: "add", width: 44} ]; gantt.init("gantt_here"); gantt.parse({ data: [ { id: 1, text: "Project #2", start_date: "01-04-2018", duration: 18, order: 10, progress: 0.4, open: true }, { id: 2, text: "Task #1", start_date: "02-04-2018", duration: 8, order: 10, progress: 0.6, parent: 1 }, { id: 3, text: "Task #2", start_date: "11-04-2018", duration: 8, order: 20, progress: 0.6, parent: 1 } ], links: [ {id: 1, source: 1, target: 2, type: "1"}, {id: 2, source: 2, target: 3, type: "0"} ] }); });
正如您在上面的示例中看到的那样,名为“文本”的列显示了任务对象的“文本”属性中的值。开始日期和持续时间也是如此。
唯一的例外是名为“add”的列–这是一个预定义的值,显示“+”号,允许用户为该任务添加子项。
基于此,您可以指定自己的列。例如,要在网格中定义四个自定义列,例如“任务名称”,“保持器”,“开始时间”和“进度”,我们应指定columns参数,其中“text”,“holder”,“start_date” '和'progress'是数据属性的名称。
gantt.config.columns = [ {name:"text", label:"Task name", tree:true, width: 150 }, {name:"holder", label:"Holder", align:"center", width: 80 }, {name:"start_date", label:"Start time", align:"center", width: 80 }, {name:"progress", label:"Progress", align:"center", width: 80 }, ];
但是,如果您想在将值显示在单元格中之前格式化值,该怎么办?在这种情况下,您将需要使用列的'template'属性。如果我们在其中使用模板,则上面的示例如下所示:
gantt.config.columns = [ {name:"text", label:"Task name", tree:true, width:"*" }, {name:"start_date", label:"Start time", align: "center" }, {name:"staff", label:"Holder(s)", template:function(obj){ return obj.holder+"("+obj.progress")"} } ];
每次重绘该列时,都会调用该模板,并将返回值放入单元格的内部HTML中。这是甘特图中几乎所有模板的重要特征。每次更新后,模板元素的内容将完全替换。这意味着,如果直接从代码中修改此类DOM元素,则下次调用模板后,所有更改将丢失。
因此,如果您需要根据用户操作来更改单元格的类型,最好的方法不是直接更改样式,而是使用模板功能设置必要的样式和标记。
gantt.config.columns = [ {name:"text", label:"Task name", tree:true, template(task){ if(gantt.getState().selected_task == task.id){ return "<b>" + task.text + "</b>"; }else{ return task.text; }; } }, {name:"start_date", label:"Start time", align: "center" }, {name:"staff", label:"Holder(s)", template:function(obj){ return obj.holder+"("+obj.progress+")"} } ];
其次,请务必注意,模板处理原始HTML值,并且不清除以任何方式从它们返回的数据。这是一个有意识的设计决策,使您可以自由自定义大多数甘特元素。但这有一个严重的后果–这样的模板可以用作XSS攻击的入口点。让我们考虑下一个示例:
document.addEventListener("DOMContentLoaded", function(event) { gantt.config.columns = [ {name:"text", label:"Task name", tree:true, template(task){ if(gantt.getState().selected_task == task.id){ return "<b>" + task.text + "</b>"; }else{ return task.text; }; } }, {name:"start_date", label:"Start time", align: "center" }, {name:"staff", label:"Holder(s)", template:function(obj){ return obj.holder+"("+obj.progress+")"} } ]; gantt.init("gantt_here"); gantt.parse({ data: [ { id: 1, text: "<img onerror='javascript:alert(\"it can`t be good\")' src='' />", start_date: "01-04-2018", duration: 18, progress: 0.4, holder:"Mike", open: true }, { id: 2, text: "Task #1", start_date: "02-04-2018", duration: 8, progress: 0.6, holder:"John", parent: 1 }, { id: 3, text: "Task #2", start_date: "11-04-2018", duration: 8, progress: 0.6, holder:"Mike", parent: 1 } ], links: [ {id: 1, source: 1, target: 2, type: "1"}, {id: 2, source: 2, target: 3, type: "0"} ] }); });
与以前的日期相同,但是这次我们在任务文本中添加了某个HTML字符串。现在,看看运行示例时发生了什么。我们放入数据中的javascript代码已在页面上执行。如果实际应用程序的后端返回了此类数据,则该代码将在每个将打开此项目的用户的浏览器中运行。这些类型的攻击通常用于向应用程序中注入恶意代码,以窃取任何敏感数据或更改页面的内容。后端开发人员有责任确保数据Feed返回的数据中没有不安全的HTML。一旦确保数据源安全且可以信任,甘特模板就绝对安全。
此外,为了能够设置Grid配置,还可以动态更改它。例如,如果要使用户能够在详细的和紧凑的Grid视图之间切换。
您只需为列config分配一个新值并重新绘制甘特色,就可以做到这一点。
document.addEventListener("DOMContentLoaded", function(event) { var largeGrid = [ {name: "text", label:"Name", tree:true, width: 200 }, {name: "start_date", label:"Start", align: "center", width: 70 }, {name: "end_date", label:"End", width: 70 }, {name: "duration", label:"Duration", width: 70 }, {name: "staff", label:"Holder(s)", template:function(obj){ return obj.holder+"("+obj.progress+")"}, width: 70 }, {name: "add", width: 44} ]; var largeGridWidth = 550; var smallGrid = [ {name: "text", label:"Task name", tree:true, width: 200 }, {name: "start_date", label:"Start time", align: "center", width: 70 }, {name: "staff", label:"Holder(s)", template:function(obj){ return obj.holder+"("+obj.progress+")"}, width: 70 } ]; var smallGridWidth = 340; gantt.toggleGrid = function(){ var newGrid; var newGridWidth; if(gantt.config.columns == largeGrid){ newGrid = smallGrid; newGridWidth = smallGridWidth }else{ newGrid = largeGrid; newGridWidth = largeGridWidth; } gantt.config.columns = newGrid; gantt.config.grid_width = newGridWidth; gantt.render(); }; gantt.config.columns = smallGrid; gantt.config.grid_width = smallGridWidth; gantt.init("gantt_here");
dhtmlxGantt可以集成到慧都APS生产计划排程系统中,实现计划修改、滚动排程、临时插单等高级智能功能,帮助企业实现数字化或智能工厂的转型。
相关产品推荐:
VARCHART XGantt:支持ActiveX、.Net等平台的C#甘特图控件
AnyGantt:构建复杂且内容丰富的甘特图的理想工具
jQuery Gantt Package:基于HTML5 / jQuery的跨平台jQuery Gantt包
phGantt Time Package:对任务和时间的分配管理的甘特图
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn
文章转载自:本文探讨 SQL Server 中 NULL 和空值之间的区别,并讨论如何有效地处理它们。
Unity 是一款功能极其丰富的游戏引擎,允许开发人员将各种媒体集成到他们的项目中。但是,它缺少最令人兴奋的功能之一 - 将 Web 内容(例如 HTML、CSS 和 JavaScript)直接渲染到 3D 场景中的纹理上的能力。在本文中,我们将介绍如何使用 DotNetBrowser 在 Unity3D 中将 Web 内容渲染为纹理。
DevExpress v24.2帮助文档正式发布上线了,请按版本按需下载~
本教程将向您展示如何用MyEclipse构建一个Web项目,欢迎下载最新版IDE体验!
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@pclwef.cn
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢