拖动任务及其依赖任务
有几种方式可以处理将任务与其依赖任务一起移动的情况。
使用自动调度扩展
一种选择是使用 자동 스케줄링 扩展。它会根据任务之间的关系自动 调度任务。
要启用自动调度,请使用 gantt.plugins 方法:
gantt.plugins({
auto_scheduling: true
});
同时,将 auto_scheduling 属性设置为 true:
gantt.config.auto_scheduling = true;
手动移动任务
章节目录
核心思路
一种常见的拖动依赖任务的方式是:
- 检测任务正在被移动
- 找到所有依赖任务,并以相同(或调整后)的幅度移动它们
你可以选择以下两种方法之一:
无论哪种方式,第一步都是获取所有关联任务。
获取所有关联任务
要查找与任务相关的链接,可以使用任务对象上的 $source 和 $target 属性。 这些属性是自动生成的,包含相关链接的 ID:
- $source - 从该任务出发的链接
- $target - 指向该任务的链接
var taskObj = gantt.getTask("t1");
var sourceLinks = taskObj.$source; //-> ["l1","l4"] - 外发链接的ID
var targetLinks = taskObj.$target; //-> ["l5","l8"] - 入链的ID
通过这些链接,可以找到依赖的任务。
要收集所有关联任务,可以定义如下迭代器:
gantt.eachSuccessor = function(callback, root){
if(!this.isTaskExists(root))
return;
// 跟踪已访问的任务,避免死循环
var traversedTasks = arguments[2] || {};
if(traversedTasks[root])
return;
traversedTasks[root] = true;
var rootTask = this.getTask(root);
var links = rootTask.$source;
if(links){
for(var i="0;" i < links.length; i++){
var link = this.getLink(links[i]);
if(this.isTaskExists(link.target) && !traversedTasks[link.target]){
callback.call(this, this.getTask(link.target));
// 遍历整 个依赖分支,不仅仅是第一层
this.eachSuccessor(callback, link.target, traversedTasks);
}
}
}
};