본문으로 건너뛰기

Angular Gantt의 데이터 바인딩 및 상태 관리

Angular Gantt는 두 가지 데이터 소유권 모델을 지원합니다:

  1. 진실의 원천으로서의 Angular 상태/스토어 (대부분의 애플리케이션에 권장).
  2. 진실의 원천으로서의 Gantt (특수 페이지를 위한 성능 중심).

페이지/기능 영역당 한 모델을 선택하고 일관되게 유지하십시오.

진실의 원천으로서의 Angular 상태/스토어

이 모델에서:

  • 컴포넌트 상태나 RxJS 스토어가 taskslinks를 소유합니다,
  • 래퍼가 입력을 통해 배열을 수신합니다,
  • 차트 변화는 data.save 또는 data.batchSave를 통해 캡처됩니다,
  • 콜백은 상태/스토어를 업데이트하고 새 배열이 <dhx-gantt>로 다시 흐릅니다.

Best for

  • 차트와 동기화되어야 하는 도구 모음/폼이 있는 Angular 페이지,
  • 서비스와 RxJS를 기반으로 이미 구축된 팀 코드베이스,
  • 예측 가능한 상태 전이와 더 쉬운 디버깅 가능성.

Tradeoffs

  • 무거운 차트 작업으로 인한 더 많은 애플리케이션 상태 업데이트,
  • 대량 편집 중 더 빈번한 동기화 작업.

Anti-patterns to avoid

  • Angular 상태에서 오래된 tasks/links 배열을 밀어내면서도 instance를 통해 데이터를 변경하는 것,
  • data.save / data.batchSave를 무시하고 차트 편집이 애플리케이션 상태에 자동으로 반영되길 기대하는 것.

Full-flow example (component state)

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를 진실의 원천으로

이 모델에서는 차트와 백엔드가 런타임 데이터 수명 주기의 대부분을 소유합니다.

Best for

  • 매우 큰 데이터 세트,
  • 차트 중심의 화면,
  • 자주 자동 일정화(auto-scheduling)되거나 연쇄 편집이 발생하고 애플리케이션 저장소 업데이트가 비용이 큰 경우.

Tradeoffs

  • Angular 서비스/컴포넌트에서 라이브 차트 상태를 즉시 볼 수 있는 가능성 감소,
  • 가끔의 입력 업데이트를 명령형 작업과 혼합할 때 필요한 추가 규율.

Anti-patterns to avoid

  • 명확한 조정 계획 없이 부분적으로 미러링하는 것,
  • 차트에서 사용자가 데이터를 변경한 후에도 오래된 서버 스냅샷을 다시 로드하는 것.

Server transport example

dataConfig = {
load: '/api/gantt/load',
save: async (entity: string, action: string, payload: any, id: string | number) => {
const response = await fetch(`/api/gantt/${entity}`, {
method: action === 'delete' ? 'DELETE' : 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ action, payload, id }),
});

return await response.json();
},
};

백엔드가 권위 있는 상태 소유자이고 Angular가 모든 편집을 실시간으로 반영할 필요가 없을 때 이 방식을 사용하십시오.

Callback Contracts

data.save

savegantt.createDataProcessor(save)에 전달되며 변경당 페이로드를 받습니다.

Typical function shape:

(entity: string, action: string, data: any, id: string | number) => any

변경이 대부분 단일적이고 차례로 적용하기 쉽다면 이 함수를 사용하십시오.

data.batchSave

batchSave는 그룹화된 페이로드를 받습니다:

interface BatchChanges {
tasks?: DataCallbackChange[];
links?: DataCallbackChange[];
resources?: DataCallbackChange[];
resourceAssignments?: DataCallbackChange[];
}

엔티티-버킷 매핑은 다음을 포함합니다:

  • task / tasks -> tasks
  • link / links -> links
  • resource / resources -> resources
  • assignment / resourceAssignment / resourceAssignments -> resourceAssignments

대기열 동작 요약:

  • 작은 디바운스 기반 배칭,
  • create + update를 최신 데이터로 하나의 create로 응집,
  • create + delete 제거,
  • 내부 !nativeeditor_status를 페이로드에서 제거.

하나의 차트 작업이 다수의 하위 변경을 촉발할 수 있을 때 이 방식을 사용하십시오.

Angular 상태에 데이터 로딩

로컬 컴포넌트 상태

작은 페이지나 프로토타입에 로컬 컴포넌트 필드를 사용하십시오.

Angular에서 데이터를 로드한 다음 배열을 taskslinks 입력에 할당합니다. 콜백 핸들러는 같은 컴포넌트에 유지합니다.

RxJS 서비스 / 스토어(중간~대형 앱에 권장)

주입 가능한 서비스에 BehaviorSubject(또는 이와 유사한 것)로 작업, 링크 및 UI 상태를 보유합니다.

이 패턴은 Angular 공개 샘플에서 사용되며 Using Angular Gantt with RxJS에 문서화되어 있습니다.

API에서 Angular 상태로 로드하기

일반 흐름:

  1. 서비스나 라우트 리졸버에서 데이터를 가져옵니다.
  2. 필요하다면 날짜 형식을 표준화하거나 매핑합니다.
  3. 데이터를 저장소/컴포넌트 상태에 푸시합니다.
  4. 배열을 <dhx-gantt>로 전달합니다.
  5. data.save 또는 data.batchSave로 수정 사항을 처리하고 백엔드에 저장합니다.

Angular 상태가 진실의 원천이고 백엔드가 여전히 장기 지속 소스인 경우에 이 방식이 적합합니다.

Angular 앱에서의 Gantt를 진실의 원천으로

이 모델이 이치가 있을 때

페이지의 대부분이 차트이고 주변의 Angular UI가 모든 task/link 업데이트에 반응할 필요가 없을 때 선택하십시오.

초기 데이터 제공

Gantt 관리 데이터를 다음 패턴 중 하나로 초기화할 수 있습니다:

  • data.load URL
  • data.load 함수(동기/비동기)
  • 초기 tasks/links 배열, 그리고 이를 더 이상 라이브 소스-오브-트루스로 취급하지 않음

업데이트 작동 방식

Gantt 인스턴스는 사용자의 변경을 내부적으로 적용하고 이를 save 또는 batchSave를 통해 보냅니다.

Angular는 각 변경 후 tasks/links를 재할당할 필요가 없으며, 명시적으로 반영하려는 경우를 제외하고는 반영하지 않아도 됩니다.

ID 재매핑 및 백엔드 책임

생성 작업은 종종 임시 클라이언트 측 ID로 시작합니다.

  • save 모드에서는 백엔드 응답이 지속 가능한 ID를 반환해야 Gantt가 내부 레코드를 재매핑할 수 있습니다.
  • batchSave 모드에서는 항목별 반환 경로가 없으므로 백엔드가 새 ID를 할당하는 경우 퍼시스턴스 워크플로우에서 명시적으로 ID 재매핑을 처리해야 합니다.

백엔드의 책임은 다음과 같습니다:

  • 검증,
  • 권한 확인,
  • 지속 가능한 ID 할당,
  • 일관된 응답 페이로드.

계속하기

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.