事件机制 - 开发教程 - 项目管理

事件机制

事件来源

有如下几个界面操作场景,会对EdoProject的数据进行操作:

  • 左侧任务树:单元格编辑。
  • 右侧条形图:拖拽调节日期或完成百分比。
  • 右键菜单:对选中任务,点击菜单项进行操作。
  • 按钮工具栏:对选中任务,点击按钮进行操作。

如果没有一个统一的业务事件处理,我们将不得不一一监听不同操作来源组件的特有事件,如:

  • 任务树:单元格编辑事件。
  • 条形图:拖拽调节事件。
  • 右键菜单:菜单项点击事件。
  • 按钮工具栏:按钮点击事件。

这会造成代码冗余和混乱,不利于代码简化和维护。

我们必须有一个统一的事件处理中心,不管发生操作的来源是什么,只需要知道发生了什么操作就可以,不需要了解是怎么发生的。

事件类型

EdoProject定义了一套业务事件,描述了所有可能的任务操作。

  • taskadd:新增任务
  • taskremove: 删除任务
  • taskchange:任务属性改变
  • taskgradechange:升级/降级任务
  • taskmove: 移动任务
  • taskedit:任务修改

其中taskedit不是任务的属性更新事件,而是作为弹出任务面板的事件。

激发事件

当我们通过不同的操作源进行操作的时候,不要直接对数据进行操作,而是激发业务事件:

//任务属性更改
dataProject.tryChangeTask(task, property, value);
//升级任务
dataProject.tryUpgradeTask(task);
//降级任务
dataProject.tryDowngradeTask(task);
//新增任务
dataProject.tryAddTask(targetTask);
//删除任务
dataProject.tryRemoveTask(task);
//编辑任务:一般用来弹出一个任务面板
dataProject.tryEditTask(task);

比如,工具栏的“删除”按钮,应该这样处理:

var r = project.getSelected();
if(r){
    project.data.tryRemoveTask(r);                    
}else{
    alert("请先选择一个任务");
}

其他的操作源组件也类似处理。

监听事件

最后,我们只需要针对DataProject监听任务操作事件,而不需要关心事件是从哪里发生的,从而可以统一的处理所有的任务相关的操作。
下面是监听DataProject事件的代码:

//监听甘特图数据对象相关事件        
dataProject.on('taskadd', onTaskAdd);                       //新增
dataProject.on('taskremove', onTaskRemove);                 //删除
dataProject.on('taskchange', onTaskChange);                 //任务属性改变(处理数据逻辑)
dataProject.on('taskgradechange', onTaskGradeChange);       //升级/降级任务
dataProject.on('taskmove', onTaskMove);                     //任务移动调整
dataProject.on('taskedit', onTaskEdit);                     //修改,用来弹出任务面板

EdoProject提供了一个标准的项目管理调度插件:ProjectSchedule.js,来专门处理所有的任务操作事件。
有关ProjectSchedule的更多内容,请访问这里