Перейти к основному содержимому

Обзор Angular Gantt

Angular Gantt — официальная обертка Angular для DHTMLX Gantt. Она предоставляет диаграмму Gantt в виде компонента Angular (<dhx-gantt>) с типизированными входами/выходами и сохраняет доступ к базовому экземпляру Gantt.

Если вам сначала нужен установочный процесс и настройка проекта, начните с Быстрого старта с Angular Gantt.

Разработка с поддержкой ИИ

Если вы используете помощника по кодированию на базе ИИ, навык агента DHTMLX Angular Gantt agent skill может помочь ему следовать корректным паттернам интеграции обертки и избегать распространённых ошибок, таких как несоответствие CSS-импортов, отсутствие высоты контейнера, смешанное владение между состоянием Angular и экземпляром Gantt (instance), и нестабильная сериализация дат через data.save / data.batchSave. Для справки по API в режиме реального времени подключите DHTMLX MCP server.

Основные возможности

Обертка предназначена как для простых, так и для продвинутых интеграций Angular:

  • Декларативная настройка с входами (config, templates, plugins, theme, locale).
  • Синхронизация данных для tasks/links и продвинутых наборов данных (resources, resourceAssignments, baselines).
  • Динамическая привязка событий через единый входной маппинг events.
  • Сигнал жизненного цикла через (ready) с доступом к инициализированному экземпляру Gantt.
  • Рендеринг компонентов Angular в шаблонах через templateComponent(...).
  • Расширенные возможности через customLightbox, groupTasks, filter, calendars, markers и resourceFilter.

Базовое использование обертки

import { Component } from '@angular/core';
import {
DhxGanttComponent,
type AngularGanttDataConfig,
} from '@dhtmlx/trial-angular-gantt';

@Component({
selector: 'app-root',
standalone: true,
imports: [DhxGanttComponent],
template: `
<div style={{height: '600px'}}>
<dhx-gantt
[tasks]="tasks"
[links]="links"
[config]="config"
[data]="dataConfig">
</dhx-gantt>
</div>
`,
})
export class AppComponent {
tasks = [
{ id: 1, text: 'Проект', type: 'project', open: true, start_date: new Date(2026, 1, 2).toISOString(), duration: 5, parent: 0 },
{ id: 2, text: 'Планирование', start_date: new Date(2026, 1, 2).toISOString(), duration: 2, parent: 1 },
];

links = [{ id: 1, source: 1, target: 2, type: '0' }];

config = {
columns: [
{ name: 'text', tree: true, width: '*' },
{ name: 'start_date', align: 'center' },
{ name: 'duration', align: 'center' },
{ name: 'add', width: 44 },
],
};

dataConfig: AngularGanttDataConfig = {
save: (entity, action, data, id) => {
console.log('[data.save]', entity, action, data, id);
},
};
}

Проп-зависимая синхронизация и компромиссы

Обертка отслеживает изменения входных данных и синхронизирует их с текущим экземпляром Gantt.

  • tasks и links синхронизируются пошагово для обычных операций добавления/обновления/удаления.
  • Для крупных структурных изменений обертка может сбросить состояние и заново разобрать данные.
  • resources, resourceAssignments и baselines синхронизируются через соответствующие хранилища данных.
  • config, templates, plugins, locale и theme применяются во время выполнения.
  • Если форма config.layout изменится, обертка может повторно инициализировать раскладку Gantt для применения новой структуры.

Используйте Основы привязки данных и управления состоянием для полного руководства по владению данными.

events Map против (ready)

Angular Gantt использует карту events для обработчиков событий Gantt и отдельный выход (ready) для однократного доступа к жизненному циклу.

import { Component } from '@angular/core';
import {
DhxGanttComponent,
type AngularGanttEvents,
type GanttStatic,
} from '@dhtmlx/trial-angular-gantt';

@Component({
standalone: true,
imports: [DhxGanttComponent],
template: `<dhx-gantt [events]="events" (ready)="onReady($event)"></dhx-gantt>`,
})
export class DemoComponent {
events: AngularGanttEvents = {
onTaskCreated: (task) => {
console.log('task created', task);
return true;
},
onBeforeLightbox: (taskId) => {
console.log('before lightbox', taskId);
return true;
},
};

onReady({ instance }: { instance: GanttStatic }): void {
console.log('ready', instance);
}
}

Используйте events для поведения взаимодействия. Используйте (ready) для логики, которая требует инициализированного экземпляра.

Доступ через ViewChild и императивные границы

Когда входных данных недостаточно, получите доступ к обертке через @ViewChild, затем используйте .instance.

import { AfterViewInit, Component, ViewChild } from '@angular/core';
import { DhxGanttComponent } from '@dhtmlx/trial-angular-gantt';

@Component({
standalone: true,
imports: [DhxGanttComponent],
template: `<dhx-gantt [tasks]="tasks" [links]="links"></dhx-gantt>`,
})
export class DemoComponent implements AfterViewInit {
@ViewChild(DhxGanttComponent) ganttCmp?: DhxGanttComponent;

tasks = [];
links = [];

ngAfterViewInit(): void {
this.ganttCmp?.instance?.showDate(new Date());
}
}

Пограничное правило: если вы изменяете задачи или связи напрямую через instance, синхронируйте входные данные Angular. Иначе следующее обновление входных данных может перезаписать изменения, сделанные на стороне диаграммы.

Расширенные точки расширения

Кастомный компонент lightbox

Используйте customLightbox, чтобы заменить встроенный редактор задач на компонент Angular.

import { CustomLightboxConfig } from '@dhtmlx/trial-angular-gantt';

customLightbox: CustomLightboxConfig = {
component: TaskEditorComponent,
onSave: ({ id, task }) => console.log('saved', id, task),
};

Ваш пользовательский компонент должен принимать входы data, onSave, onCancel и onDelete.

Компоненты Angular в шаблонах

Используйте templateComponent(...) в templates, в template столбца, в label столбца или других слотах, поддерживающих шаблоны.

import { templateComponent } from '@dhtmlx/trial-angular-gantt';

templates = {
task_text: (_start: Date, _end: Date, task: any) =>
templateComponent(TaskTextTemplateComponent, {
task,
onIconClick: () => this.toggleTask(task),
}),
};

Это позволяет Angular рендерить компоненты внутри DOM-областей, управляемых Gantt.

Фильтрация

Используйте вход filter, чтобы определить, какие задачи должны отображаться:

import type { TaskFilter } from '@dhtmlx/trial-angular-gantt';

taskFilter: TaskFilter = null;

showCompleted(): void {
this.taskFilter = (task) => !!task.completed;
}

resetFilter(): void {
this.taskFilter = null;
}
<dhx-gantt
[tasks]="tasks"
[links]="links"
[filter]="taskFilter">
</dhx-gantt>

Чтобы фильтровать ресурсы в панели ресурсов, используйте вход resourceFilter:

<dhx-gantt
[tasks]="tasks"
[links]="links"
[resources]="resources"
[resourceAssignments]="resourceAssignments"
[resourceFilter]="resourceFilter"
[config]="config">
</dhx-gantt>

Группировка, календари и маркеры

Используйте groupTasks, calendars и markers для продвинутых сценариев временной шкалы без императивного кода настройки.

<dhx-gantt
[tasks]="tasks"
[links]="links"
[groupTasks]="groupConfig"
[calendars]="calendars"
[markers]="markers"
[config]="config">
</dhx-gantt>

Примечание по встроенному редактированию

Обертка не предоставляет отдельный вход Angular-only inlineEditors. Используйте конфигурацию встроенного редактирования Gantt в config.columns[].editor (и другие API встроенного редактирования) когда вам нужно редактирование в гриде.

Публичная карта образцов сценариев

Публичные образцы Angular охватывают следующие сценарии обёртки:

  • basic-initialization: базовые входы и data.save.
  • configs-and-templates: обновления config/templates во время выполнения, маркеры, плагины.
  • template-components: templateComponent(...), filter, ready, динамический UI в грид/шаблонах задач.
  • custom-form: интеграция customLightbox.
  • resource-panel: ресурсы, назначения, размещение ресурсов, resourceFilter, доступ к экземпляру через (ready).
  • calendars: calendars, templates, локаль, выделение рабочего времени.
  • auto-scheduling: активация плагинов и пакетные изменения данных.
  • state-management: обновления, управляемые RxJS store, с data.batchSave и отменой/повтором.
  • inline-editors: базовая конфигурация встроенного редактирования Gantt через config.

Связанные статьи

Need help?
Got a question about the documentation? Reach out to our technical support team for help and guidance. For custom component solutions, visit the Services page.