操作指南
如何切换网格/图表
如果使用默认布局配置,您可以修改 show_grid 或 show_chart 参数,并使用 render() 方法重新绘制变更。
function toggleGrid(){
gantt.config.show_grid = !gantt.config.show_grid;
gantt.render();
}
相关示例 Gantt. Toggle grid (default layout)
function toggleChart(){
gantt.config.show_chart = !gantt.config.show_chart;
gantt.render();
}
相关示例 Gantt. Toggle timeline (default layout)
如果使用自定义布局配置,您需要创建多种布局配置 —— 同时包含网格/时间线和不包含网格/时间线的情况。要在它们之间切换,需要修改 gantt.config.layout 参数并应用 init() 方法以查看变更:
let showGrid = true;
function toggleGrid() {
showGrid = !showGrid;
if (showGrid) {
gantt.config.layout = gridAndChart; // 同时包含网格和时间线的布局
}
else {
gantt.config.layout = onlyChart; // 仅包含时间线的布局
}
gantt.init("gantt_here");
}
相关示例 Gantt. Toggle grid (custom layout)
let showChart = true;
function toggleChart() {
showChart = !showChart;
if (showChart) {
gantt.config.layout = gridAndChart; // 同时包含网格和时间线的布局
}
else {
gantt.config.layout = onlyGrid; // 仅包含网格的布局
}
gantt.init("gantt_here");
}
相关示例 Gantt. Toggle timeline (custom layout)
如何切换资源视图
与前面的用例类似,您需要创建多种布局配置 —— 同时包含资源视图和不包含资源视图。要在它们之间切换,需要修改 gantt.config.layout 参数并应用 init() 方法以查看变更:
let resourceChart = true;
function layoutChange() {
resourceChart = !resourceChart;
if (resourceChart) {
gantt.config.layout = resourceLayout;
}
else {
gantt.config.layout = noresourceLayout;
}
gantt.init("gantt_here");
};
相关示例 Gantt. Toggle resource load diagram
let histogramView = true;
function layoutChange() {
histogramView = !histogramView;
if (histogramView) {
gantt.config.layout = histogramLayout;
}
else {
gantt.config.layout = simpleLayout;
}
gantt.init("gantt_here");
};
相关示例 Gantt. Toggle resource histogram
或者,您也可以通过使用布局视图并重新初始化 Gantt 来查看变更来生成布局:
如何在时间线实现无限滚动
实现无限滚动有多种方式,但在大多数情况下,您需要修改显示的日期范围(gantt.config.start_date 和 gantt.config.end_date 参数):
使用滚动条时
您需要获取 scroll position 并增加日期范围。请注意,过于频繁地重新绘制 Gantt 将影响性能,因此需要在超时后再进行绘制:
gantt.init("gantt_here");
gantt.parse(tasks);
gantt.attachEvent("onGanttScroll", function (left, top) {
const left_date = gantt.dateFromPos(left)
const right_date = gantt.dateFromPos(left + gantt.$task.offsetWidth)
gantt.config.start_date = gantt.config.start_date || gantt.getState().min_date;
gantt.config.end_date = gantt.config.end_date || gantt.getState().max_date;
const min_allowed_date = gantt.date.add(gantt.config.start_date, 1, "day");
const max_allowed_date = gantt.date.add(gantt.config.end_date, -2, "day");
let repaint = false;
if (+left_date <= +min_allowed_date) {
gantt.config.start_date = gantt.date.add(gantt.config.start_date, -2, "day");
repaint = true;
}
if (+right_date >= +max_allowed_date) {
gantt.config.end_date = gantt.date.add(gantt.config.end_date, 2, "day");
repaint = true;
}
if (repaint) {
setTimeout(function () {
gantt.render()
gantt.showDate(left_date)
}, 20)
}
});
相关示例 Gantt. Infinite scroll while using scrollbar
拖动时间线时
您需要获取当前滚动位置,并在时间线起始或结束附近时增加显示的日期范围:
gantt.attachEvent("onMouseMove", function (id, e) {
if (!gantt.getState().drag_id && e.buttons == 1) {
const left_date = gantt.dateFromPos(gantt.getScrollState().x);
const right_date = gantt.dateFromPos(
gantt.getScrollState().x + gantt.$task.offsetWidth - 1
);
if (left_date && +left_date <= +gantt.config.start_date) {
gantt.config.start_date = gantt.date.add(gantt.config.start_date, -1, 'day');
gantt.render();
}
if (right_date && +gantt.config.end_date < +gantt.date.add(right_date, 1, 'day')) {
gantt.config.end_date = gantt.date.add(gantt.config.end_date, 1, 'day');
gantt.render();
}
}
});
相关示例 Gantt. Infinite scroll while dragging the timeline
拖动任务时
如果未设置日期范围,您可以在任务拖动接近时间线起点或终点时每次调用 render() 方法来重新绘制:
gantt.init("gantt_here");
gantt.parse(tasks);
gantt.attachEvent("onTaskDrag", function (id, mode, task, original) {
if (task.start_date <= gantt.getState().min_date ||
task.end_date >= gantt.getState().max_date) {
gantt.render()
}
});
相关示例 Gantt. Infinite scroll while dragging a task (default range settings)
如果已经设置了 date range,则需要修改它:
gantt.init("gantt_here");
gantt.parse(tasks);
gantt.config.start_date = new Date(2025, 02, 28)
gantt.config.end_date = new Date(2025, 03, 10)
gantt.render();
gantt.attachEvent("onTaskDrag", function (id, mode, task, original) {
if (+task.start_date <= +gantt.config.start_date) {
gantt.config.start_date = gantt.date.add(
gantt.config.start_date, -1, gantt.config.duration_unit
);
gantt.render()
}
if (+task.end_date >= +gantt.config.end_date) {
gantt.config.end_date = gantt.date.add(
gantt.config.end_date, 1, gantt.config.duration_unit
);
gantt.render()
}
});
相关示例 Gantt. Infinite scroll while dragging a task (explicit range settings)
如何动态加载任务
您可以在 onGanttScroll 事件中检测滚动到底部可见任务,并使用 parse() 方法加载新任务:
gantt.attachEvent("onGanttScroll", function (left, top) {
const visibleTasks = gantt.getVisibleTaskCount();
const lastVisibleTask = gantt.getTaskByIndex(visibleTasks - 1)
if (gantt.getTaskRowNode(lastVisibleTask.id)) {
const tasks = load_tasks()
gantt.parse(tasks);
}
});
相关示例 Gantt. Load data dynamically
如何用按钮展开/折叠所有任务
您可以使用 open() 和 close() 方法来打开和关闭某个任务。要对图表中的所有任务执行此操作,您需要在 eachTask() 函数中使用该方法。要仅绘制一次变更,您可以将函数包裹在 batchUpdate() 方法中:
function collapseAll() {
gantt.batchUpdate(function () {
gantt.eachTask(function (task) {
gantt.close(task.id)
})
})
}
function expandAll() {
gantt.batchUpdate(function () {
gantt.eachTask(function (task) {
gantt.open(task.id)
})
})
}
相关示例 Gantt. Add collapse/expand buttons into Gantt header
相关示例 Gantt. Collapse/expand all tasks
如何在网格单元格/表头显示多行文本
这可以通过添加一些样式规则实现。
网格表头:
.gantt_grid_head_text{
line-height: 12px;
white-space:normal;
}
相关示例 Gantt. Multiline text in the grid header
网格单元格:
.gantt_tree_content, .gantt_task_content{
line-height: 12px;
white-space:normal;
overflow-wrap: break-word;
}
相关示例 Gantt. Multiline text in Grid cells and Timeline
相关示例 Gantt. Multiline text in cells of a Grid column
如何在网格中添加自定义列
要添加自定义列,您需要修改 gantt.config.columns 参数。如果指定了 name 参数,Gantt 将返回具有同名的任务属性的值。您还可以使用 template() 函数返回任意自定义日期或 HTML 元素。
gantt.config.columns = [
/*
其他列
*/
{
name: "progress", label: "Progress", width: 50, resize: true, align: "center",
template: function (task) {
return Math.round(task.progress * 100) + "%"
}
},
/*
其他列
*/
];
相关示例 Gantt. Custom column with template for task progress
相关示例 Gantt. Custom column with template for action buttons