주요 콘텐츠로 건너뛰기

Angular와의 통합

이 문서를 읽기 전에 Angular의 기본 개념과 패턴을 먼저 숙지하시기 바랍니다. 내용을 복습하려면 Angular 문서를 참조하세요.

DHTMLX To Do List는 Angular와 호환됩니다. 아래 예제에서 두 기술을 함께 사용하는 방법을 보여줍니다. 완성된 프로젝트 예제는 GitHub의 예제를 참조하세요.

프로젝트 생성

새 Angular 프로젝트를 스캐폴딩하고 의존성을 설치합니다.

정보

새 프로젝트를 생성하기 전에 Angular CLINode.js를 설치하세요.

Angular CLI로 새로운 my-angular-todo-app 프로젝트를 생성합니다. 다음 명령어를 실행하세요:

ng new my-angular-todo-app
노트

이 가이드를 따라 진행하려면 새 Angular 앱 생성 시 Server-Side Rendering (SSR) 및 Static Site Generation (SSG/Prerendering)을 비활성화하세요.

명령어 실행 시 필요한 모든 도구가 설치됩니다.

의존성 설치

새로 생성된 앱 디렉터리로 이동합니다:

cd my-angular-todo-app

yarn 패키지 매니저로 의존성을 설치하고 개발 서버를 시작합니다:

yarn
yarn start

앱이 로컬호스트 주소(예: http://localhost:3000)에서 실행됩니다.

To Do List 생성

앱을 중단하고 To Do List 패키지를 설치합니다.

1단계. 패키지 설치

평가판 To Do List 패키지를 다운로드하고 README 파일의 단계를 따르세요. 평가판은 30일 동안만 사용할 수 있습니다.

2단계. 컴포넌트 생성

Toolbar가 포함된 To Do List를 애플리케이션에 추가할 Angular 컴포넌트를 생성합니다. src/app/ 디렉터리에 todo 폴더를 추가하고 그 안에 todo.component.ts 파일을 생성합니다.

소스 파일 가져오기

todo.component.ts를 열고 To Do List 소스 파일을 가져옵니다. 두 가지 가져오기 경로 중 하나를 선택하세요:

  • 로컬 폴더에서 설치한 PRO 버전 — dhx-todolist-package에서 가져오기
  • 평가판 버전 — @dhx/trial-todolist에서 가져오기

아래 코드 조각은 PRO 패키지에서 가져오는 예입니다:

todo.components.ts
import { ToDo, Toolbar } from 'dhx-todolist-package';

아래 코드 조각은 평가판 패키지에서 가져오는 예입니다:

todo.components.ts
import { ToDo, Toolbar } from '@dhx/trial-todolist';

이 튜토리얼에서는 평가판 버전을 사용합니다.

컨테이너 설정 및 Toolbar가 포함된 To Do List 초기화

페이지에 Toolbar가 포함된 To Do List를 표시하려면 두 컴포넌트의 컨테이너를 설정하고 생성자로 초기화합니다. 아래 예제는 템플릿을 정의하고, 컨테이너를 참조하며, ngOnInit() 내부에서 컴포넌트를 초기화합니다:

todo.component.ts
import { ToDo, Toolbar } from '@dhx/trial-todolist'; 
import { Component, ElementRef, OnInit, ViewChild, OnDestroy, ViewEncapsulation} from '@angular/core';

@Component({
encapsulation: ViewEncapsulation.None,
selector: "todo", // "app.component.ts"에서 <todo />로 사용되는 템플릿 이름
styleUrls: ["./todo.component.css"], // css 파일 포함

template: `<main class = "component_container">
<div #toolbar_container></div>
<div #todo_container class = "widget"></div>
</main>`
})

export class ToDoComponent implements OnInit, OnDestroy {
// Toolbar 컨테이너 초기화
@ViewChild("toolbar_container", { static: true }) toolbar_container!: ElementRef;
// To Do List 컨테이너 초기화
@ViewChild("todo_container", { static: true }) todo_container!: ElementRef;

private _todo!: ToDo;
private _toolbar!: Toolbar;

ngOnInit() {
// To Do List 컴포넌트 초기화
this._todo = new ToDo(this.todo_container.nativeElement, {});

// Toolbar 컴포넌트 초기화
this._toolbar = new Toolbar(this.toolbar_container.nativeElement, {
api: this._todo.api,
// 기타 구성 속성
});
}

ngOnDestroy(): void {
this._todo.destructor(); // To Do List 소멸
this._toolbar.destructor(); // Toolbar 소멸
}
}

스타일 추가

To Do List가 올바르게 렌더링되도록 CSS 파일을 가져옵니다. src/app/todo/ 디렉터리에 todo.component.css 파일을 생성하고 To Do List와 해당 컨테이너의 스타일을 추가합니다. 아래 코드 조각은 To Do List 스타일을 가져오고 레이아웃 크기를 설정합니다:

todo.component.css
/* To Do List 스타일 가져오기 */
@import "@dhx/trial-todolist/dist/todo.css";

/* 초기 페이지 스타일 */
html,
body{
height: 100%;
padding: 0;
margin: 0;
background-color: #f7f7f7;
}

/* To Do List와 Toolbar 컨테이너 스타일 */
.component_container {
height: 100%;
max-width: 800px;
margin: 0 auto;
}

/* To Do List 컨테이너 스타일 */
.widget {
height: calc(100% - 56px);
}

데이터 로드

src/app/todo/ 디렉터리에 data.ts 파일을 생성하고 데이터를 추가합니다. 아래 예제는 tasks, users, projects를 반환하는 getData() 함수를 내보냅니다:

data.ts
export function getData() {
const tasks = [
{
id: "temp://1652991560212",
project: "introduction",
text: "Greetings, everyone! \u{1F44B} \nI'm DHTMLX To Do List.",
priority: 1
},
{
id: "1652374122964",
project: "introduction",
text: "You can assign task performers and due dates using the menu.",
assigned: ["user_4", "user_1", "user_2", "user_3"],
due_date: "2033-03-08T21:00:00.000Z",
priority: 2
},
// ...
];
const users = [
{
id: "user_1",
label: "Don Smith",
avatar:
"https://snippet.dhtmlx.com/codebase/data/common/img/02/avatar_61.jpg"
},
// ...
];
const projects = [
{
id: "introduction",
label: "Introduction to DHTMLX To Do List"
},
{
id: "widgets",
label: "Our widgets"
}
];
return { tasks, users, projects };
}

todo.component.ts를 열고 데이터 파일을 가져온 다음, ngOnInit() 메서드 내의 To Do List 구성 객체에 데이터 속성을 전달합니다. 아래 코드 조각은 초기화 시 사용자, 작업, 프로젝트 데이터를 적용합니다:

todo.component.ts
import { ToDo, Toolbar } from '@dhx/trial-todolist';
import { getData } from "./data"; // 데이터 가져오기
import { Component, ElementRef, OnInit, ViewChild, OnDestroy, ViewEncapsulation} from '@angular/core';

@Component({
encapsulation: ViewEncapsulation.None,
selector: "todo",
styleUrls: ["./todo.component.css"],
template: `<main class = "component_container">
<div #toolbar_container></div>
<div #todo_container class = "widget"></div>
</main>`
})

export class ToDoComponent implements OnInit, OnDestroy {
@ViewChild("toolbar_container", { static: true }) toolbar_container!: ElementRef;
@ViewChild("todo_container", { static: true }) todo_container!: ElementRef;

private _todo!: ToDo;
private _toolbar!: Toolbar;

ngOnInit() {
const { users, tasks, projects } = getData(); // 데이터 속성 초기화
this._todo = new ToDo(this.todo_container.nativeElement, {
users,
tasks,
projects,
// 기타 구성 속성
});

this._toolbar = new Toolbar(this.toolbar_container.nativeElement, {
api: this._todo.api,
// 기타 구성 속성
});
}

ngOnDestroy(): void {
this._todo.destructor();
this._toolbar.destructor();
}
}

ngOnInit() 내부에서 parse() 메서드를 사용하여 To Do List에 데이터를 로드할 수도 있습니다. 아래 예제는 초기화 후 parse()로 데이터를 로드합니다:

todo.component.ts
import { ToDo, Toolbar } from '@dhx/trial-todolist';
import { getData } from "./data"; // 데이터 가져오기
import { Component, ElementRef, OnInit, ViewChild, OnDestroy, ViewEncapsulation} from '@angular/core';

@Component({
encapsulation: ViewEncapsulation.None,
selector: "todo",
styleUrls: ["./todo.component.css"],
template: `<main class = "component_container">
<div #toolbar_container></div>
<div #todo_container class = "widget"></div>
</main>`
})

export class ToDoComponent implements OnInit, OnDestroy {
@ViewChild("toolbar_container", { static: true }) toolbar_container!: ElementRef;
@ViewChild("todo_container", { static: true }) todo_container!: ElementRef;

private _todo!: ToDo;
private _toolbar!: Toolbar;

ngOnInit() {
const { users, tasks, projects } = getData(); // 데이터 속성 초기화
this._todo = new ToDo(this.todo_container.nativeElement, {});

this._toolbar = new Toolbar(this.toolbar_container.nativeElement, {
api: this._todo.api,
// 기타 구성 속성
});

// parse() 메서드로 데이터 적용
this._todo.parse({
users,
tasks,
projects
});
}

ngOnDestroy(): void {
this._todo.destructor();
this._toolbar.destructor();
}
}

parse(data)를 호출할 때마다 현재 데이터셋이 교체됩니다.

이제 컴포넌트가 데이터가 채워진 To Do List를 렌더링합니다. 사용 가능한 다른 속성은 구성 개요를 참조하세요.

이벤트 처리

사용자 동작에 반응하려면 이벤트를 구독하세요. 이벤트 전체 목록을 참조하세요.

todo.component.ts를 열고 ngOnInit() 메서드를 완성합니다. 아래 코드 조각은 add-task 이벤트에 핸들러를 연결합니다:

todo.component.ts
// ...
ngOnInit() {
this._todo = new ToDo(this.todo_container.nativeElement, {});

this._todo.events.on("add-task", (obj) => {
console.log("A new task is added", obj);
});
}

ngOnDestroy(): void {
this._todo.destructor();
}

3단계. 앱에 To Do List 추가

ToDoComponent를 앱에 추가하려면 src/app/app.component.ts를 열고 기본 코드를 아래 코드 조각으로 교체합니다:

app.component.ts
import { Component } from "@angular/core";

@Component({
selector: "app-root",
template: `<todo/>` // "todo.component.ts"에서 생성된 템플릿
})
export class AppComponent {
name = "";
}

src/app/ 디렉터리에 app.module.ts 파일을 생성하고 ToDoComponent를 등록합니다. 아래 예제는 컴포넌트를 선언하고 앱을 부트스트랩합니다:

app.module.ts
import { NgModule } from "@angular/core";
import { BrowserModule } from "@angular/platform-browser";

import { AppComponent } from "./app.component";
import { ToDoComponent } from "./todo/todo.component";

@NgModule({
declarations: [AppComponent, ToDoComponent],
imports: [BrowserModule],
bootstrap: [AppComponent]
})
export class AppModule {}

마지막으로 src/main.ts를 열고 기존 코드를 다음으로 교체합니다:

main.ts
import { platformBrowserDynamic } from "@angular/platform-browser-dynamic";
import { AppModule } from "./app/app.module";
platformBrowserDynamic()
.bootstrapModule(AppModule)
.catch((err) => console.error(err));

앱을 시작하면 To Do List가 샘플 데이터와 함께 렌더링됩니다:

To Do List 초기화

완성된 프로젝트는 GitHub에서 확인할 수 있습니다.