入门

工作原理

Kickoff在设计上以数据驱动为核心思想,通过与内置事件系统结合,实现数据模型与视图的相互通信。 对数据模型的更新,会自动同步到视图上。

一个组件的完整生命周期会经历以下几个阶段:

数据模型实例化 → 视图组件实例化并绑定数据模型 → 视图组件产生交互动作并调用数据模型相应方法 → 数据模型产生变化并通过事件系统通知视图组件 → 视图组件更新 → 数据模型销毁并通过事件系统通知视图组件 → 视图组件销毁

开始实践

下面我们通过编写几个demo,来直观地感受一下Kickoff的工作原理。

首先,我们通过构造函数kickoff创建一个实例,这个实例在初始化的时候有两个任务。 当然,在初始化的时候也可以不设置任何任务。我们将这个实例挂载到id为my-kickoff这个div节点上。 你可以通过点击下方不同的Tab页来查看代码和效果。

接下来,我们通过操作 Task 模型,为上面创建的实例添加几个任务。 我们添加一个顶级任务,这个顶级任务所有字段使用默认值,比如:任务名称为New Task,wbs编号自动计算, 开始时间为当前系统时间,结束时间为24小时之后。 另外,我们为First Task和Second Task分别添加一个子级任务。在添加First Task的子任务时, 由于这个子任务设置的开始结束时间与父级任务不同,父级任务的周期自动进行调整。 在添加Second Task的子任务时,我们不设置子任务的周期,因此,它继承父级任务的开始结束时间。

我们继续来操作 Task 模型。在上一步中, 我们使用默认字段值来创建了一个顶级任务,这个任务的wbs编号为3, 我们把这个任务的开始结束时间还有名称更新一下。 另外,再把Second Task的结束时间也进行更新, 由于2.1这个子任务的结束时间与父级任务相同,因此,任务2.1的结束时间同步被调整。

在下面的步骤中,我们将学习添加任务之间的依赖关系。在开始实践之前,需要先了解几个概念。

前置、后置任务是任务之间依赖关系的一种表达,是按照任务执行的先后顺序进行划分的。 从具体的依赖类型角度来讲,依赖关系可分为以下四种:

  • StartToStart(s2s) - 后置任务开始时间不得早于前置任务开始时间
  • FinishToStart(f2s) - 后置任务开始时间不得早于前置任务结束时间
  • StartToFinish(s2f) - 后置任务结束时间不得早于前置任务开始时间
  • FinishToFinish(f2f) - 后置任务结束时间不得早于前置任务结束时间

通过以上四种依赖类型的约束条件,我们可以得出如下结论:

任务开始或结束时间的延后在依赖关系中不受约束,但是后置任务开始或结束时间的提前受到前置任务的约束。

在了解了以上基本概念后,我们把First Task设置为Second Task的f2s型前置任务, 相对的,也可以说把Second Task设置为First Task的f2s型后置任务。 由于Second Task原本的开始时间要早于First Task的结束时间,所以在添加了依赖关系后, Second Task的开始时间按照f2s约束规则调整为与First Task相同。

接下来,我们来创建一个里程碑(0.2.0新增)。里程碑从模型的本质上来说也是一个任务实例。所不同的是, 一个里程碑型任务的开始和结束时间是始终一致的。另外,里程碑任务不支持创建后代任务, 因此一切与后代任务相关的操作,里程碑任务均不支持。(从使用场景来说,里程碑的后代任务没有实际意义。) 在Kickoff中创建里程碑任务的方式很简单,相对于普通任务的创建,只需要指定type为milestone即可。 至于里程碑任务的开始和结束时间,可以任意通过beginning或end字段设定,需要注意的是, 如果同时设定了beginning或end值,会以end为准。

任务的删除操作是一个很常见的需求,在Kickoff中删除任务很简单,只需要调用对应任务模型的销毁方法即可。 如果任务具有后代任务,其后代任务也会被级联删除。 如果被删除的这些任务中有与其它未被删除的任务的依赖关系,那么这些依赖关系也会被删除。 需要注意的是,在任务删除后,其兄弟任务的wbs编号会自动发生变化。 因此,wbs编号不能作为识别任务唯一性的标识,而应该使用任务的uid属性。 下面,我们就来删除掉First Task,并且检验一下其兄弟任务uid的唯一性。

最后一步,我们来调用一下 Task 模型的数据获取方法, 把我们通过代码创建的任务格式化为json。

通过以上步骤的学习,你已经了解了Kickoff最基本的使用。在Kickoff的使用过程中, 绝大多数时间都是在与 Task 模型打交道, 对于这个模型的数据结构和方法一定要熟悉。

顺便提一下,除了 Task 模型外, Kickoff还提供了其他帮助开发者高效开发的数据模型。 Time 模型作为操作时间对象的利器,是对原生Date对象的替代和强化, 可以方便地处理时间计算,使用起来也很简单。 Timeline 是Kickoff组件gantt视图中时间线处理的数据模型, 一般来说并不需要直接操作,除非是在需要手动控制时间线的场景下。

对于定制化需求较强的场景, 请参考 配置教程事件教程 以及 Kickoff 模型中与配置项相关的数据结构和其他模型API文档中的事件部分。