AnyChart/AnyGantt实时编辑:能否禁用单个任务的操作手柄?
在AnyChart甘特图中实现单个任务的编辑限制或特定操作手柄禁用
AnyChart本身没有提供直接配置单个任务编辑权限的API,也没有内置禁用特定操作手柄的选项,但可以通过事件拦截的方式实现需求,以下是具体方案:
一、完全禁用单个任务的所有编辑操作
在任务数据中添加自定义标记(比如isEditable),然后监听所有编辑相关的事件,在回调中判断标记并阻止默认行为:
1. 修改任务数据,添加自定义权限标记
{ id: 26235, name: "AP 10", parent: 7251, typ: "AD", status: 5, actualStart: Date.UTC(2024, 3-1, 14), actualEnd: Date.UTC(2024, 3-1, 21), baselineStart: Date.UTC(2024, 3-1, 11), baselineEnd: Date.UTC(2024, 3-1, 18), isEditable: false, // 自定义标记:该任务不可编辑 connector: [ { connectTo: 26236, connectorType: 'finish-start' } ] }
2. 监听编辑相关事件并拦截
// 拦截任务编辑(双击打开编辑面板) chart.listen('taskEditStart', function(e) { const task = e.task; if (!task.get('isEditable')) { e.preventDefault(); } }); // 拦截任务移动操作 chart.listen('taskMoveStart', function(e) { const task = e.task; if (!task.get('isEditable')) { e.preventDefault(); } }); // 拦截任务大小调整操作 chart.listen('taskResizeStart', function(e) { const task = e.task; if (!task.get('isEditable')) { e.preventDefault(); } }); // 拦截连接器添加操作 chart.listen('connectorAdd', function(e) { const sourceTask = e.sourceTask; const targetTask = e.targetTask; // 源或目标任务不可编辑时,阻止添加连接器 if (!sourceTask.get('isEditable') || !targetTask.get('isEditable')) { e.preventDefault(); } }); // 拦截连接器移除操作 chart.listen('connectorRemove', function(e) { const connector = e.connector; const sourceTask = connector.sourceTask(); const targetTask = connector.targetTask(); if (!sourceTask.get('isEditable') || !targetTask.get('isEditable')) { e.preventDefault(); } });
二、禁用任务栏的特定操作手柄(比如禁止调整开始日期)
通过taskResizeStart事件的side属性判断拖动的是左侧(修改开始日期)还是右侧(修改结束日期)手柄,结合自定义标记实现精准拦截:
1. 修改任务数据,添加细分权限标记
{ id: 26235, name: "AP 10", parent: 7251, typ: "AD", status: 5, actualStart: Date.UTC(2024, 3-1, 14), actualEnd: Date.UTC(2024, 3-1, 21), baselineStart: Date.UTC(2024, 3-1, 11), baselineEnd: Date.UTC(2024, 3-1, 18), allowResizeStart: false, // 自定义标记:禁止调整开始日期(左侧手柄) allowMove: false, // 可选:禁止移动任务(避免移动时修改开始日期) connector: [ { connectTo: 26236, connectorType: 'finish-start' } ] }
2. 监听对应事件实现拦截
// 禁止拖动左侧手柄修改开始日期 chart.listen('taskResizeStart', function(e) { const task = e.task; if (e.side === 'left' && !task.get('allowResizeStart')) { e.preventDefault(); } }); // 可选:禁止移动任务(防止移动时同时修改开始/结束日期) chart.listen('taskMoveStart', function(e) { const task = e.task; if (!task.get('allowMove')) { e.preventDefault(); } });
说明
AnyChart官方文档未提及此类细分权限配置,上述事件拦截方案是基于库的事件系统实现的可行方案,通过自定义数据属性标记权限,再在事件回调中判断并阻止默认行为,即可实现单个任务的编辑控制或特定操作手柄的禁用。
内容的提问来源于stack exchange,提问作者user23733199
相关产品推荐
相关产品推荐

