Angular Gantt 中的数据绑定与状态管理
Angular Gantt 支持两种数据所有权模型:
- 将 Angular state/store 作为真实数据源(大多数应用推荐)。
- Gantt 作为真实数据源(面向性能的专用页面)。
每个页/功能区域仅选择一种模型并保持一致。
将 Angular State/Store 作为真实数据源
在这种模型中:
- 你的组件状态或 RxJS store 拥有
tasks和links, - 包装组件通过 inputs 接收数组,
- 图表变更通过
data.save或data.batchSave捕获, - 回调更新你的状态/存储,新的数组再流回到
<dhx-gantt>。
最适合
- 需要与图表保持同步的工具栏/表单的 Angular 页面,
- 已经围绕服务和 RxJS 构建的团队代码库,
- 可预测的状态转换和更容易调试。
权衡
- 对于大量图表操作,需要更多应用程序状态的更新,
- 在批量编辑期间需要更频繁的同步工作。
应避免的反模式
- 通过
instance变更数据,同时仍从 Angular 状态推送陈旧的tasks/links数组, - 忽略
data.save/data.batchSave,期望图表编辑会自动在应用状态中持久化。
完整流程示例(组件状态)
import { Component } from '@angular/core';
import {
DhxGanttComponent,
type AngularGanttDataConfig,
type SerializedTask,
type SerializedLink,
} from '@dhtmlx/trial-angular-gantt';
@Component({
standalone: true,
imports: [DhxGanttComponent],
template: `<dhx-gantt [tasks]="tasks" [links]="links" [data]="dataConfig"></dhx-gantt>`,
})
export class GanttPageComponent {
tasks: SerializedTask[] = [];
links: SerializedLink[] = [];
dataConfig: AngularGanttDataConfig = {
save: (entity, action, item, id) => {
if (entity === 'task') {
if (action === 'create') this.tasks = [...this.tasks, item];
if (action === 'update') this.tasks = this.tasks.map((t) => String(t.id) === String(id) ? { ...t, ...item } : t);
if (action === 'delete') this.tasks = this.tasks.filter((t) => String(t.id) !== String(id));
}
if (entity === 'link') {
if (action === 'create') this.links = [...this.links, item];
if (action === 'update') this.links = this.links.map((l) => String(l.id) === String(id) ? { ...l, ...item } : l);
if (action === 'delete') this.links = this.links.filter((l) => String(l.id) !== String(id));
}
},
};
}
Gantt 作为真实数据源
在此模型中,图表和后端拥有大部分运行时数据生命周期。
最适合
- 非常大的数据集,
- 以图表为中心的屏幕,
- 在频繁的自动排程或链式编辑中,后端更新应用商店成本较高。
权衡
- 在 Angular 服务/组件中对实时图表状态的可见性较低,
- 与命令式操作混合时需要额外的组织纪律。