如何使用循环 return 我的 DHTMLX 甘特图数据?
How do I return my DHTMLX Gantt data using a loop?
我正在使用 DHTMLX Gantt Chart。作为我项目的一部分,我创建了许多自定义层来处理图表,但遗憾的是,这让我的代码变得非常臃肿,不得不将每个任务声明为一个层。我最初的想法是使用循环和对象数组添加任务。当我尝试这种方法时,它不起作用并且没有呈现任何内容。
到目前为止,这是我的代码:
//Gantt Initilisation
document.addEventListener("DOMContentLoaded", function (event) {
// Specifying the date format
gantt.config.xml_date = "%Y-%m-%d %H:%i";
gantt.config.readonly = true;
// Initializing gantt
gantt.init("positionsReport");
// Initiating data loading
gantt.load("/api/data/get");
// Initializing dataProcessor
var dp = new gantt.dataProcessor("/api/");
//Convert date to a usable format
gantt.attachEvent("onTaskLoading", function (task) {
task.options_start = gantt.date.parseDate(task.options_start, "xml_date");
task.options_end = gantt.date.parseDate(task.options_end, "xml_date");
task.f2_onhire = gantt.date.parseDate(task.f2_onhire, "xml_date");
task.f2_offhire = gantt.date.parseDate(task.f2_offhire, "xml_date");
task.f2_options_start = gantt.date.parseDate(task.f2_options_start, "xml_date");
task.f2_options_end = gantt.date.parseDate(task.f2_options_end, "xml_date");
task.f3_onhire = gantt.date.parseDate(task.f3_onhire, "xml_date");
task.f3_offhire = gantt.date.parseDate(task.f3_offhire, "xml_date");
return true;
});
这是使用图层之前的基本设置,我初始化甘特图,将一些日期时间转换为它理解的格式,然后定义我的 API 和所需的数据。
//Fixture Layers
gantt.addTaskLayer(function draw_planned(task) {
var fixtureArray = [
{
onhire: task.start_date,
offhire: task.end_date,
charterer: task.current_charterer
},
{
onhire: task.f2_onhire,
offhire: task.f2_offhire,
charterer: task.f2_charterer
},
{
onhire: task.f3_onhire,
offhire: task.f3_offhire,
charterer: task.f3_charterer
}
];
为了这个问题的目的,我根据我需要的任务数据创建了一个短数组,它被限制为三个项目。
for (i = 0; i < fixtureArray.length; i++) {
var sizes = gantt.getTaskPosition(fixtureArray, fixtureArray.onhire, fixtureArray.offhire);
var el = document.createElement('div');
el.className = 'gantt_task_content';
return el;
}
return false;
});
然后我尝试为数组中的每个项目创建所需的图层。
gantt.config.columns = [
{ name: "text", tree: false, width: 150, resize: true, align: "left", label: "Vessel" },
{ name: "start_date", align: "center", width: 150, resize: true, align: "left", label: "Onhire" },
{ name: "duration", align: "center", width: 70, resize: true, hide: true }
];
//Month format
gantt.config.scale_unit = "month";
gantt.config.date_scale = "%M";
//View
gantt.config.start_date = new Date(2019, 01, 01);
gantt.config.end_date = new Date(2020, 01, 01);
// and attaching it to gantt
dp.init(gantt);
// setting the REST mode for dataProcessor
dp.setTransactionMode("REST");
});
然后我以日期范围、比例和休息模式设置以及最终初始化语句结束。
甘特图工作正常,没有错误消息,但是,它只呈现我的数组循环中的一项,其余的永远不会出现。我的方法是否适合此设置?
一个函数只能有一个 return 值,您的代码会在第一次迭代时退出 addTaskLayer
函数。
如果你想让它显示多个元素,你可以创建一个额外的 'wrapper' 元素,将你的项目附加到它和 return 来自函数的 wrapper
元素:
var wrapper = document.createElement('div'); //!!!
for (i = 0; i < fixtureArray.length; i++) {
var sizes = gantt.getTaskPosition(fixtureArray, fixtureArray.onhire, fixtureArray.offhire);
var el = document.createElement('div');
el.className = 'gantt_task_content';
wrapper.appendChild(el); //!!!
}
if(wrapper.children.length){
return wrapper; //!!!
}
return false;
比如你可以看看这个demo:
https://docs.dhtmlx.com/gantt/samples/04_customization/18_subtasks_displaying.html - 检查 Task #2 行,addTaskLayer 函数使用相同的方法添加了多个元素。
我正在使用 DHTMLX Gantt Chart。作为我项目的一部分,我创建了许多自定义层来处理图表,但遗憾的是,这让我的代码变得非常臃肿,不得不将每个任务声明为一个层。我最初的想法是使用循环和对象数组添加任务。当我尝试这种方法时,它不起作用并且没有呈现任何内容。
到目前为止,这是我的代码:
//Gantt Initilisation
document.addEventListener("DOMContentLoaded", function (event) {
// Specifying the date format
gantt.config.xml_date = "%Y-%m-%d %H:%i";
gantt.config.readonly = true;
// Initializing gantt
gantt.init("positionsReport");
// Initiating data loading
gantt.load("/api/data/get");
// Initializing dataProcessor
var dp = new gantt.dataProcessor("/api/");
//Convert date to a usable format
gantt.attachEvent("onTaskLoading", function (task) {
task.options_start = gantt.date.parseDate(task.options_start, "xml_date");
task.options_end = gantt.date.parseDate(task.options_end, "xml_date");
task.f2_onhire = gantt.date.parseDate(task.f2_onhire, "xml_date");
task.f2_offhire = gantt.date.parseDate(task.f2_offhire, "xml_date");
task.f2_options_start = gantt.date.parseDate(task.f2_options_start, "xml_date");
task.f2_options_end = gantt.date.parseDate(task.f2_options_end, "xml_date");
task.f3_onhire = gantt.date.parseDate(task.f3_onhire, "xml_date");
task.f3_offhire = gantt.date.parseDate(task.f3_offhire, "xml_date");
return true;
});
这是使用图层之前的基本设置,我初始化甘特图,将一些日期时间转换为它理解的格式,然后定义我的 API 和所需的数据。
//Fixture Layers
gantt.addTaskLayer(function draw_planned(task) {
var fixtureArray = [
{
onhire: task.start_date,
offhire: task.end_date,
charterer: task.current_charterer
},
{
onhire: task.f2_onhire,
offhire: task.f2_offhire,
charterer: task.f2_charterer
},
{
onhire: task.f3_onhire,
offhire: task.f3_offhire,
charterer: task.f3_charterer
}
];
为了这个问题的目的,我根据我需要的任务数据创建了一个短数组,它被限制为三个项目。
for (i = 0; i < fixtureArray.length; i++) {
var sizes = gantt.getTaskPosition(fixtureArray, fixtureArray.onhire, fixtureArray.offhire);
var el = document.createElement('div');
el.className = 'gantt_task_content';
return el;
}
return false;
});
然后我尝试为数组中的每个项目创建所需的图层。
gantt.config.columns = [
{ name: "text", tree: false, width: 150, resize: true, align: "left", label: "Vessel" },
{ name: "start_date", align: "center", width: 150, resize: true, align: "left", label: "Onhire" },
{ name: "duration", align: "center", width: 70, resize: true, hide: true }
];
//Month format
gantt.config.scale_unit = "month";
gantt.config.date_scale = "%M";
//View
gantt.config.start_date = new Date(2019, 01, 01);
gantt.config.end_date = new Date(2020, 01, 01);
// and attaching it to gantt
dp.init(gantt);
// setting the REST mode for dataProcessor
dp.setTransactionMode("REST");
});
然后我以日期范围、比例和休息模式设置以及最终初始化语句结束。
甘特图工作正常,没有错误消息,但是,它只呈现我的数组循环中的一项,其余的永远不会出现。我的方法是否适合此设置?
一个函数只能有一个 return 值,您的代码会在第一次迭代时退出 addTaskLayer
函数。
如果你想让它显示多个元素,你可以创建一个额外的 'wrapper' 元素,将你的项目附加到它和 return 来自函数的 wrapper
元素:
var wrapper = document.createElement('div'); //!!!
for (i = 0; i < fixtureArray.length; i++) {
var sizes = gantt.getTaskPosition(fixtureArray, fixtureArray.onhire, fixtureArray.offhire);
var el = document.createElement('div');
el.className = 'gantt_task_content';
wrapper.appendChild(el); //!!!
}
if(wrapper.children.length){
return wrapper; //!!!
}
return false;
比如你可以看看这个demo: https://docs.dhtmlx.com/gantt/samples/04_customization/18_subtasks_displaying.html - 检查 Task #2 行,addTaskLayer 函数使用相同的方法添加了多个元素。