{"id":3963,"date":"2017-03-22T18:00:24","date_gmt":"2017-03-22T14:00:24","guid":{"rendered":"https:\/\/dhtmlx.com\/blog\/?p=3963"},"modified":"2026-02-23T10:37:31","modified_gmt":"2026-02-23T07:37:31","slug":"dhtmlx-gantt-chart-usage-angularjs-2-framework","status":"publish","type":"post","link":"https:\/\/dhtmlx.com\/blog\/dhtmlx-gantt-chart-usage-angularjs-2-framework\/","title":{"rendered":"DHTMLX Gantt Chart Usage with Angular Framework"},"content":{"rendered":"<p><em><strong>Note:<\/strong> The information provided in this tutorial is outdated. We are working on a refreshed version, but in the meantime, please follow the relevant <a href=\"https:\/\/docs.dhtmlx.com\/gantt\/integrations\/angular\/howtostart-angular\/\" rel=\"noopener\" target=\"_blank\">step-by-step guide<\/a> in the DHTMLX Gantt documentation. You can also check the <a href=\"https:\/\/github.com\/DHTMLX\/angular-gantt-demo\" rel=\"noopener\" target=\"_blank\">DHTMLX Gantt with Angular demo<\/a> on GitHub.<\/em> <\/p>\n<p>The JavaScript ecosystem is regularly enriched with promising frameworks, but many web developers still prefer to use some time-proven options such as Angular. That&#8217;s why our plan for today is to give you a good starting point for using DHTMLX Gantt with the Angular framework.<\/p>\n<p>Now we&#8217;re going to implement an angular Gantt chart component for <a href=\"\/\/dhtmlx.com\/docs\/products\/dhtmlxGantt\/\" target=\"_blank\">DHTMLX Gantt<\/a> (JavaScript Gantt Chart), add it into the small application and bind it to the RESTful API on a backend. We\u2019ll write this demo in TypeScript since it\u2019s a recommended way, although it also can be done in plain JavaScript or in ES6.<\/p>\n<p>Please mind that in this tutorial we won\u2019t cover server-side logic of data saving. Instead, we\u2019ll emulate the backend using the <a href=\"https:\/\/github.com\/angular\/in-memory-web-api\" target=\"_blank\">Angular in-memory-web-api tool<\/a>.<\/p>\n<p><strong>You can download a <a href=\"https:\/\/github.com\/DHTMLX\/angular-gantt-demo\" target=\"_blank\">complete Angular Gantt chart demo<\/a> from GitHub<\/strong>.<\/p>\n<h4>Preparing App<\/h4>\n<p>To set up a development environment, we&#8217;ll use <strong>angular cli<\/strong>. If you don&#8217;t have <strong>angular cli<\/strong> you can get it with a package manager (npm install -g @angular\/cli) or check <a href=\"https:\/\/v17.angular.io\/start\" target=\"_blank\">its documentation<\/a> for more details. To create an app skeleton, run the following command:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">ng <span class=\"kw1\">new<\/span> gantt<span class=\"sy0\">-<\/span>angular<\/div><\/div>\n<p>You\u2019ll be asked to pick a preset (add Angular routing or not, stylesheet type). Select the necessary options to configure the system to your needs.<\/p>\n<p>After the operation finishes, we can go to the app directory and run the application:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">cd gantt<span class=\"sy0\">-<\/span>angular<br \/>\nng serve<\/div><\/div>\n<p>Now, if we open <strong>http:\/\/127.0.0.1:4200<\/strong> we should see the initial page. The <strong>ng serve<\/strong> command will watch the source file and, if necessary, will change and rebuild the app.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-11272\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2017\/03\/image3.png\" alt=\"DHTMLX Gantt + Angular\" width=\"958\" height=\"967\" srcset=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2017\/03\/image3.png 958w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2017\/03\/image3-150x150.png 150w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2017\/03\/image3-297x300.png 297w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2017\/03\/image3-768x775.png 768w\" sizes=\"auto, (max-width: 958px) 100vw, 958px\" \/><\/p>\n<h4>Creating gantt chart component<\/h4>\n<p>First, we should get the DHTMLX Gantt chart code. Starting from Gantt v6.1, type definitions are bundled with the package, so we don\u2019t need to install them separately. Run the following command in order to add Gantt:<\/p>\n<div class=\"codecolorer-container text default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"text codecolorer\">npm install dhtmlx-gantt --save<\/div><\/div>\n<p>To add dhtmlxGantt to the Angular app we should create a new component. For this, run the following command:<\/p>\n<div class=\"codecolorer-container text default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"text codecolorer\">ng generate component gantt --skip-tests<\/div><\/div>\n<p>In the newly created &#8220;<strong>gantt.component.ts<\/strong>&#8221; file inside the &#8220;<strong>gantt<\/strong>&#8221; folder, we will add the next lines of code:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw5\">import<\/span> <span class=\"br0\">&#123;<\/span> Component<span class=\"sy0\">,<\/span> ElementRef<span class=\"sy0\">,<\/span> OnInit<span class=\"sy0\">,<\/span> ViewChild<span class=\"sy0\">,<\/span> ViewEncapsulation <span class=\"br0\">&#125;<\/span> from <span class=\"st0\">'@angular\/core'<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw5\">import<\/span> <span class=\"br0\">&#123;<\/span> gantt <span class=\"br0\">&#125;<\/span> from <span class=\"st0\">'dhtmlx-gantt'<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp;<br \/>\n<span class=\"sy0\">@<\/span>Component<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; encapsulation<span class=\"sy0\">:<\/span> ViewEncapsulation.<span class=\"me1\">None<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; selector<span class=\"sy0\">:<\/span> <span class=\"st0\">'gantt'<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; styleUrls<span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><span class=\"st0\">'.\/gantt.component.css'<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; template<span class=\"sy0\">:<\/span> `<span class=\"sy0\">&lt;<\/span>div <span class=\"st0\">&quot;gantt-chart&quot;<\/span><span class=\"sy0\">&gt;&lt;\/<\/span>div<span class=\"sy0\">&gt;<\/span>`<span class=\"sy0\">,<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"kw5\">export<\/span> <span class=\"kw5\">class<\/span> GanttComponent <span class=\"kw5\">implements<\/span> OnInit <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"sy0\">@<\/span>ViewChild<span class=\"br0\">&#40;<\/span><span class=\"st0\">'gantt_here'<\/span><span class=\"sy0\">,<\/span> <span class=\"br0\">&#123;<\/span> <span class=\"kw1\">static<\/span><span class=\"sy0\">:<\/span> <span class=\"kw2\">true<\/span> <span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span> ganttContainer<span class=\"sy0\">!:<\/span> ElementRef<span class=\"sy0\">;<\/span><br \/>\n&nbsp;<br \/>\n&nbsp; &nbsp; ngOnInit<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; gantt.<span class=\"me1\">init<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw1\">this<\/span>.<span class=\"me1\">ganttContainer<\/span>.<span class=\"me1\">nativeElement<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>Here we\u2019ve defined our new component. It can be used with the &#8220;gantt&#8221; tag in html. When an element is loaded, it initializes gantt inside the container.<\/p>\n<p>Note that we\u2019ll declare gantt styles in the separate file named &#8220;gantt.component.css&#8221;. Default styles can look like the following:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"sy0\">@<\/span><span class=\"kw5\">import<\/span> <span class=\"st0\">'dhtmlx-gantt\/codebase\/dhtmlxgantt.css'<\/span><span class=\"sy0\">;<\/span><br \/>\n.<span class=\"me1\">gantt<\/span><span class=\"sy0\">-<\/span>chart <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; position<span class=\"sy0\">:<\/span> relative<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; width<span class=\"sy0\">:<\/span> <span class=\"nu0\">100<\/span><span class=\"sy0\">%;<\/span><br \/>\n&nbsp; &nbsp; height<span class=\"sy0\">:<\/span> 600px<span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>Next, we can put out a new component to the page. For this, open &#8220;app.component.html&#8221; and put the following code in there:<\/p>\n<div class=\"codecolorer-container text default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"text codecolorer\">&lt;gantt&gt;&lt;\/gantt&gt;<\/div><\/div>\n<p>Now if we open the page, we should see an empty gantt chart on it.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-11275\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2017\/03\/image1.png\" alt=\"Empty Gantt chart\" width=\"957\" height=\"618\" srcset=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2017\/03\/image1.png 957w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2017\/03\/image1-300x194.png 300w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2017\/03\/image1-768x496.png 768w\" sizes=\"auto, (max-width: 957px) 100vw, 957px\" \/><\/p>\n<h4>Data Loading<\/h4>\n<p>To add data loading to our Angular gantt chart, we are going to add task and link services. But let us create models first.<br \/>\nFor creating the <strong>task<\/strong> model, run the following command:<\/p>\n<div class=\"codecolorer-container text default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"text codecolorer\">ng generate class models\/task --skip-tests<\/div><\/div>\n<p>In the newly created &#8220;<strong>task.ts<\/strong>&#8221; file inside the &#8220;<strong>models<\/strong>&#8221; folder, we will add the next lines of code:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw5\">export<\/span> <span class=\"kw5\">class<\/span> Task <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; id<span class=\"sy0\">!:<\/span> number<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; start_date<span class=\"sy0\">!:<\/span> string<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; text<span class=\"sy0\">!:<\/span> string<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; progress<span class=\"sy0\">!:<\/span> number<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; duration<span class=\"sy0\">!:<\/span> number<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; parent<span class=\"sy0\">!:<\/span> number<span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>Then, create the <strong>link<\/strong> model:<\/p>\n<div class=\"codecolorer-container text default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"text codecolorer\">ng generate class models\/link --skip-tests<\/div><\/div>\n<p>And add the following code to the &#8220;link.ts&#8221; file:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw5\">export<\/span> <span class=\"kw5\">class<\/span> Link <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp;id<span class=\"sy0\">!:<\/span> number<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; source<span class=\"sy0\">!:<\/span> number<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; target<span class=\"sy0\">!:<\/span> number<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; type<span class=\"sy0\">!:<\/span> string<span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>Now, let\u2019s create our services. Service is a class responsible for doing a specific task. Angular services can be injected using the Dependency Injection mechanism and include data, function or some features necessary for your application. We\u2019re going to create a data service that we\u2019ll use to provide our gantt chart with tasks.<\/p>\n<p>For creating <strong>task<\/strong> service, run the following command:<\/p>\n<div class=\"codecolorer-container text default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"text codecolorer\">ng generate service services\/task --flat --skip-tests<\/div><\/div>\n<p>In the newly created &#8220;<strong>task.service.ts<\/strong>&#8221; file inside the &#8220;<strong>services<\/strong>&#8221; folder, it is required to add the next lines of code:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw5\">import<\/span> <span class=\"br0\">&#123;<\/span> Injectable <span class=\"br0\">&#125;<\/span> from <span class=\"st0\">'@angular\/core'<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw5\">import<\/span> <span class=\"br0\">&#123;<\/span> Task <span class=\"br0\">&#125;<\/span> from <span class=\"st0\">'..\/models\/task'<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp;<br \/>\n<span class=\"sy0\">@<\/span>Injectable<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"kw5\">export<\/span> <span class=\"kw5\">class<\/span> TaskService <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">get<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">:<\/span> Promise<span class=\"sy0\">&lt;<\/span>Task<span class=\"br0\">&#91;<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">&gt;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> Promise.<span class=\"me1\">resolve<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span> id<span class=\"sy0\">:<\/span> <span class=\"nu0\">1<\/span><span class=\"sy0\">,<\/span> text<span class=\"sy0\">:<\/span> <span class=\"st0\">'Task #1'<\/span><span class=\"sy0\">,<\/span> start_date<span class=\"sy0\">:<\/span> <span class=\"st0\">'2023-04-15 00:00'<\/span><span class=\"sy0\">,<\/span> duration<span class=\"sy0\">:<\/span> <span class=\"nu0\">3<\/span><span class=\"sy0\">,<\/span> progress<span class=\"sy0\">:<\/span> <span class=\"nu0\">0.6<\/span><span class=\"sy0\">,<\/span> parent<span class=\"sy0\">:<\/span> <span class=\"nu0\">0<\/span> <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span> id<span class=\"sy0\">:<\/span> <span class=\"nu0\">2<\/span><span class=\"sy0\">,<\/span> text<span class=\"sy0\">:<\/span> <span class=\"st0\">'Task #2'<\/span><span class=\"sy0\">,<\/span> start_date<span class=\"sy0\">:<\/span> <span class=\"st0\">'2023-04-18 00:00'<\/span><span class=\"sy0\">,<\/span> duration<span class=\"sy0\">:<\/span> <span class=\"nu0\">3<\/span><span class=\"sy0\">,<\/span> progress<span class=\"sy0\">:<\/span> <span class=\"nu0\">0.4<\/span><span class=\"sy0\">,<\/span> parent<span class=\"sy0\">:<\/span> <span class=\"nu0\">0<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>We\u2019ve added the <strong>@Injectable()<\/strong> decorator to our service. It marks a class as available to an injector for instantiation. We\u2019ll inject it into our component further.<\/p>\n<p>Currently, it returns the resolved promise with hard-coded data. But you can load data from the server side and return the promise. We will discuss it in more detail below.<\/p>\n<p>Then, create a <strong>link<\/strong> service:<\/p>\n<div class=\"codecolorer-container text default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"text codecolorer\">ng generate service services\/link --flat --skip-tests<\/div><\/div>\n<p>Add the following code to the &#8220;<strong>link.service.ts<\/strong>&#8221; file:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw5\">import<\/span> <span class=\"br0\">&#123;<\/span> Injectable <span class=\"br0\">&#125;<\/span> from <span class=\"st0\">'@angular\/core'<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw5\">import<\/span> <span class=\"br0\">&#123;<\/span> Link <span class=\"br0\">&#125;<\/span> from <span class=\"st0\">'..\/models\/link'<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp;<br \/>\n<span class=\"sy0\">@<\/span>Injectable<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"kw5\">export<\/span> <span class=\"kw5\">class<\/span> LinkService <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">get<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">:<\/span> Promise<span class=\"sy0\">&lt;<\/span>Link<span class=\"br0\">&#91;<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">&gt;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> Promise.<span class=\"me1\">resolve<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span> id<span class=\"sy0\">:<\/span> <span class=\"nu0\">1<\/span><span class=\"sy0\">,<\/span> source<span class=\"sy0\">:<\/span> <span class=\"nu0\">1<\/span><span class=\"sy0\">,<\/span> target<span class=\"sy0\">:<\/span> <span class=\"nu0\">2<\/span><span class=\"sy0\">,<\/span> type<span class=\"sy0\">:<\/span> <span class=\"st0\">'0'<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>This service is pretty much the same as a task service.<\/p>\n<p>Now open our &#8220;<strong>gantt.component.ts<\/strong>&#8220;. We should add TaskService and LinkService to our component. Firstly, add the necessary imports for our services:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw5\">import<\/span> <span class=\"br0\">&#123;<\/span>TaskService<span class=\"br0\">&#125;<\/span> from <span class=\"st0\">&quot;..\/services\/task.service&quot;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw5\">import<\/span> <span class=\"br0\">&#123;<\/span>LinkService<span class=\"br0\">&#125;<\/span> from <span class=\"st0\">&quot;..\/services\/link.service&quot;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>Also, we should add the <strong>providers<\/strong> property to the <strong>@Component<\/strong> decorator argument:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">providers<span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span>TaskService<span class=\"sy0\">,<\/span> LinkService<span class=\"br0\">&#93;<\/span><\/div><\/div>\n<p>It tells angular to create fresh instances of our services when it creates a new <strong>GanttComponent<\/strong>. So, our component can use those services to get tasks and links.<\/p>\n<p>Now, we can inject our services into the component. For this purpose, add the following constructor to <strong>GanttComponent<\/strong> class:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">constructor<span class=\"br0\">&#40;<\/span>private taskService<span class=\"sy0\">:<\/span> TaskService<span class=\"sy0\">,<\/span> private linkService<span class=\"sy0\">:<\/span> LinkService<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span> <span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>Add the following code to the <strong>ngOnInit<\/strong> function.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">gantt.<span class=\"me1\">config<\/span>.<span class=\"me1\">date_format<\/span> <span class=\"sy0\">=<\/span> <span class=\"st0\">'%Y-%m-%d %H:%i'<\/span><span class=\"sy0\">;<\/span><br \/>\ngantt.<span class=\"me1\">init<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw1\">this<\/span>.<span class=\"me1\">ganttContainer<\/span>.<span class=\"me1\">nativeElement<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp;<br \/>\nPromise.<span class=\"me1\">all<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#91;<\/span><span class=\"kw1\">this<\/span>.<span class=\"me1\">taskService<\/span>.<span class=\"kw1\">get<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">,<\/span> <span class=\"kw1\">this<\/span>.<span class=\"me1\">linkService<\/span>.<span class=\"kw1\">get<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; .<span class=\"me1\">then<\/span><span class=\"br0\">&#40;<\/span> <span class=\"br0\">&#40;<\/span><span class=\"br0\">&#91;<\/span>data<span class=\"sy0\">,<\/span> links<span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; gantt.<span class=\"me1\">parse<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span> data<span class=\"sy0\">,<\/span> links <span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>Here we&#8217;ve added the <strong>date_format<\/strong> config definition. It sets the data format for the loading tasks. Also here we call our services to get a function and then are waiting for a response to put data to gantt. <strong>gantt.parse<\/strong> accepts data objects of the <a href=\"https:\/\/docs.dhtmlx.com\/gantt\/desktop__supported_data_formats.html#json\" target=\"_blank\" rel=\"noopener\">following structure<\/a>.<\/p>\n<p>We should get the code like that in our gantt.component.ts file:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw5\">import<\/span> <span class=\"br0\">&#123;<\/span> Component<span class=\"sy0\">,<\/span> ElementRef<span class=\"sy0\">,<\/span> OnInit<span class=\"sy0\">,<\/span> ViewChild<span class=\"sy0\">,<\/span> ViewEncapsulation <span class=\"br0\">&#125;<\/span> from <span class=\"st0\">'@angular\/core'<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw5\">import<\/span> <span class=\"br0\">&#123;<\/span> TaskService <span class=\"br0\">&#125;<\/span> from <span class=\"st0\">'..\/services\/task.service'<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw5\">import<\/span> <span class=\"br0\">&#123;<\/span> LinkService <span class=\"br0\">&#125;<\/span> from <span class=\"st0\">'..\/services\/link.service'<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw5\">import<\/span> <span class=\"br0\">&#123;<\/span> Gantt <span class=\"br0\">&#125;<\/span> from <span class=\"st0\">'dhtmlx-gantt'<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp;<br \/>\n<span class=\"sy0\">@<\/span>Component<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; encapsulation<span class=\"sy0\">:<\/span> ViewEncapsulation.<span class=\"me1\">None<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; selector<span class=\"sy0\">:<\/span> <span class=\"st0\">'gantt'<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; styleUrls<span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><span class=\"st0\">'.\/gantt.component.css'<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; providers<span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span>TaskService<span class=\"sy0\">,<\/span> LinkService<span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; template<span class=\"sy0\">:<\/span> `<span class=\"sy0\">&lt;<\/span>div <span class=\"kw5\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;gantt-chart&quot;<\/span><span class=\"sy0\">&gt;&lt;\/<\/span>div<span class=\"sy0\">&gt;<\/span>`<span class=\"sy0\">,<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"kw5\">export<\/span> <span class=\"kw5\">class<\/span> GanttComponent <span class=\"kw5\">implements<\/span> OnInit <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"sy0\">@<\/span>ViewChild<span class=\"br0\">&#40;<\/span><span class=\"st0\">'gantt_here'<\/span><span class=\"sy0\">,<\/span> <span class=\"br0\">&#123;<\/span> <span class=\"kw1\">static<\/span><span class=\"sy0\">:<\/span> <span class=\"kw2\">true<\/span> <span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span> ganttContainer<span class=\"sy0\">!:<\/span> ElementRef<span class=\"sy0\">;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; constructor<span class=\"br0\">&#40;<\/span>private taskService<span class=\"sy0\">:<\/span> TaskService<span class=\"sy0\">,<\/span> private linkService<span class=\"sy0\">:<\/span> LinkService<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp;<br \/>\n&nbsp; &nbsp; ngOnInit<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; gantt.<span class=\"me1\">config<\/span>.<span class=\"me1\">date_format<\/span> <span class=\"sy0\">=<\/span> <span class=\"st0\">'%Y-%m-%d %H:%i'<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; gantt.<span class=\"me1\">init<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw1\">this<\/span>.<span class=\"me1\">ganttContainer<\/span>.<span class=\"me1\">nativeElement<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; Promise.<span class=\"me1\">all<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#91;<\/span><span class=\"kw1\">this<\/span>.<span class=\"me1\">taskService<\/span>.<span class=\"kw1\">get<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">,<\/span> <span class=\"kw1\">this<\/span>.<span class=\"me1\">linkService<\/span>.<span class=\"kw1\">get<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .<span class=\"me1\">then<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#91;<\/span>data<span class=\"sy0\">,<\/span> links<span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; gantt.<span class=\"me1\">parse<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span> data<span class=\"sy0\">,<\/span> links <span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>Now, if we open an app, we should see our tasks with a link between them.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-11276\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2017\/03\/image2-1024x492.png\" alt=\"tasks with dependency links between them\" width=\"1024\" height=\"492\" srcset=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2017\/03\/image2-1024x492.png 1024w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2017\/03\/image2-300x144.png 300w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2017\/03\/image2-768x369.png 768w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2017\/03\/image2.png 1277w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<h4>Data Saving<\/h4>\n<p>In this tutorial, we&#8217;re not going to create an actual database and write a backend. Instead, we&#8217;ll mock the backend with the help of the <a href=\"https:\/\/github.com\/angular\/in-memory-web-api\" target=\"_blank\" rel=\"noopener\">angular-in-memory-web-api<\/a> library \u2013 it&#8217;ll intercept xhr requests and call data storage we&#8217;ll define on the client. If it&#8217;s not what you want, you can skip the first step and the app will call the real backend.<\/p>\n<p><strong>1.<\/strong> At first, we should install angular-in-memory-web-api. For this, run the following command:<\/p>\n<div class=\"codecolorer-container text default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"text codecolorer\">npm install angular-in-memory-web-api --save<\/div><\/div>\n<p>Open &#8220;<strong>app.module.ts<\/strong>&#8221; to add <strong>InMemoryWebApiModule<\/strong> and define our mock database initialization. We will create a necessary class on the next step. For now, our app.module.ts should look like that:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw5\">import<\/span> <span class=\"br0\">&#123;<\/span> NgModule <span class=\"br0\">&#125;<\/span> from <span class=\"st0\">&quot;@angular\/core&quot;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw5\">import<\/span> <span class=\"br0\">&#123;<\/span> BrowserModule <span class=\"br0\">&#125;<\/span> from <span class=\"st0\">&quot;@angular\/platform-browser&quot;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"kw5\">import<\/span> <span class=\"br0\">&#123;<\/span> AppRoutingModule <span class=\"br0\">&#125;<\/span> from <span class=\"st0\">'.\/app-routing.module'<\/span><span class=\"sy0\">;<\/span> <br \/>\n<span class=\"kw5\">import<\/span> <span class=\"br0\">&#123;<\/span> AppComponent <span class=\"br0\">&#125;<\/span> from <span class=\"st0\">&quot;.\/app.component&quot;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw5\">import<\/span> <span class=\"br0\">&#123;<\/span> GanttComponent <span class=\"br0\">&#125;<\/span> from <span class=\"st0\">'.\/gantt\/gantt.component'<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"kw5\">import<\/span> <span class=\"br0\">&#123;<\/span> HttpClientModule <span class=\"br0\">&#125;<\/span> from <span class=\"st0\">'@angular\/common\/http'<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw5\">import<\/span> <span class=\"br0\">&#123;<\/span> HttpClientInMemoryWebApiModule <span class=\"br0\">&#125;<\/span> from <span class=\"st0\">'angular-in-memory-web-api'<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw5\">import<\/span> <span class=\"br0\">&#123;<\/span> InMemoryDataService <span class=\"br0\">&#125;<\/span> from <span class=\"st0\">'.\/services\/in-memory-data.service'<\/span><br \/>\n&nbsp;<br \/>\n<span class=\"sy0\">@<\/span>NgModule<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; declarations<span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span>AppComponent<span class=\"sy0\">,<\/span> GanttComponent<span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; imports<span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span>BrowserModule<span class=\"sy0\">,<\/span> AppRoutingModule<span class=\"sy0\">,<\/span> HttpClientModule<span class=\"sy0\">,<\/span> HttpClientInMemoryWebApiModule.<span class=\"me1\">forRoot<\/span><span class=\"br0\">&#40;<\/span>InMemoryDataService<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; providers<span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; bootstrap<span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span>AppComponent<span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"kw5\">export<\/span> <span class=\"kw5\">class<\/span> AppModule <span class=\"br0\">&#123;<\/span><span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>For creating the <strong>in-memory-data<\/strong> service, run the following command:<\/p>\n<div class=\"codecolorer-container text default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"text codecolorer\">ng generate service services\/in-memory-data --flat --skip-tests<\/div><\/div>\n<p>In the newly created &#8220;<strong>in-memory-data.service.ts<\/strong>&#8221; file inside the &#8220;<strong>services<\/strong>&#8221; folder, we will add the next lines of code:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw5\">import<\/span> <span class=\"br0\">&#123;<\/span> InMemoryDbService <span class=\"br0\">&#125;<\/span> from <span class=\"st0\">'angular-in-memory-web-api'<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"kw5\">export<\/span> <span class=\"kw5\">class<\/span> InMemoryDataService <span class=\"kw5\">implements<\/span> InMemoryDbService <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; createDb<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; let tasks <span class=\"sy0\">=<\/span> <span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span> id<span class=\"sy0\">:<\/span> <span class=\"nu0\">1<\/span><span class=\"sy0\">,<\/span> text<span class=\"sy0\">:<\/span> <span class=\"st0\">'Task #1'<\/span><span class=\"sy0\">,<\/span> start_date<span class=\"sy0\">:<\/span> <span class=\"st0\">'2023-04-15 00:00'<\/span><span class=\"sy0\">,<\/span> duration<span class=\"sy0\">:<\/span> <span class=\"nu0\">3<\/span><span class=\"sy0\">,<\/span> progress<span class=\"sy0\">:<\/span> <span class=\"nu0\">0.6<\/span> <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span> id<span class=\"sy0\">:<\/span> <span class=\"nu0\">2<\/span><span class=\"sy0\">,<\/span> text<span class=\"sy0\">:<\/span> <span class=\"st0\">'Task #2'<\/span><span class=\"sy0\">,<\/span> start_date<span class=\"sy0\">:<\/span> <span class=\"st0\">'2023-04-18 00:00'<\/span><span class=\"sy0\">,<\/span> duration<span class=\"sy0\">:<\/span> <span class=\"nu0\">3<\/span><span class=\"sy0\">,<\/span> progress<span class=\"sy0\">:<\/span> <span class=\"nu0\">0.4<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#93;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; let links <span class=\"sy0\">=<\/span> <span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#123;<\/span> id<span class=\"sy0\">:<\/span> <span class=\"nu0\">1<\/span><span class=\"sy0\">,<\/span> source<span class=\"sy0\">:<\/span> <span class=\"nu0\">1<\/span><span class=\"sy0\">,<\/span> target<span class=\"sy0\">:<\/span> <span class=\"nu0\">2<\/span><span class=\"sy0\">,<\/span> type<span class=\"sy0\">:<\/span> <span class=\"st0\">'0'<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#93;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"br0\">&#123;<\/span> tasks<span class=\"sy0\">,<\/span> links <span class=\"br0\">&#125;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p><strong>2.<\/strong> Let us create a helper for our requests. To do that, create &#8220;<strong>service-helper.ts<\/strong>&#8221; with the following code:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw5\">export<\/span> <span class=\"kw1\">function<\/span> HandleError<span class=\"br0\">&#40;<\/span>error<span class=\"sy0\">:<\/span> any<span class=\"br0\">&#41;<\/span><span class=\"sy0\">:<\/span> Promise<span class=\"br0\">&#123;<\/span><br \/>\nconsole.<span class=\"me1\">log<\/span><span class=\"br0\">&#40;<\/span>error<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">return<\/span> Promise.<span class=\"me1\">reject<\/span><span class=\"br0\">&#40;<\/span>error<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>The HandleError will put an error to the console in case of some errors.<\/p>\n<p><strong>3.<\/strong> Update our services to handle the adding, updating, and deleting of items. Open &#8220;task.service.ts&#8221; and add the following code to it:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw5\">import<\/span> <span class=\"br0\">&#123;<\/span> Injectable <span class=\"br0\">&#125;<\/span> from <span class=\"st0\">'@angular\/core'<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw5\">import<\/span> <span class=\"br0\">&#123;<\/span> Task <span class=\"br0\">&#125;<\/span> from <span class=\"st0\">'..\/models\/task'<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw5\">import<\/span> <span class=\"br0\">&#123;<\/span> HttpClient <span class=\"br0\">&#125;<\/span> from <span class=\"st0\">'@angular\/common\/http'<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw5\">import<\/span> <span class=\"br0\">&#123;<\/span> HandleError <span class=\"br0\">&#125;<\/span> from <span class=\"st0\">'.\/service-helper'<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw5\">import<\/span> <span class=\"br0\">&#123;<\/span> firstValueFrom <span class=\"br0\">&#125;<\/span> from <span class=\"st0\">'rxjs'<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp;<br \/>\n<span class=\"sy0\">@<\/span>Injectable<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"kw5\">export<\/span> <span class=\"kw5\">class<\/span> TaskService <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; private taskUrl <span class=\"sy0\">=<\/span> <span class=\"st0\">'api\/tasks'<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; constructor<span class=\"br0\">&#40;<\/span>private http<span class=\"sy0\">:<\/span> HttpClient<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"kw1\">get<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">:<\/span> Promise<span class=\"sy0\">&lt;<\/span>Task<span class=\"br0\">&#91;<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">&gt;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> firstValueFrom<span class=\"br0\">&#40;<\/span><span class=\"kw1\">this<\/span>.<span class=\"me1\">http<\/span>.<span class=\"kw1\">get<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw1\">this<\/span>.<span class=\"me1\">taskUrl<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .<span class=\"kw1\">catch<\/span><span class=\"br0\">&#40;<\/span>HandleError<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; insert<span class=\"br0\">&#40;<\/span>task<span class=\"sy0\">:<\/span> Task<span class=\"br0\">&#41;<\/span><span class=\"sy0\">:<\/span> Promise<span class=\"sy0\">&lt;<\/span>Task<span class=\"sy0\">&gt;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> firstValueFrom<span class=\"br0\">&#40;<\/span><span class=\"kw1\">this<\/span>.<span class=\"me1\">http<\/span>.<span class=\"me1\">post<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw1\">this<\/span>.<span class=\"me1\">taskUrl<\/span><span class=\"sy0\">,<\/span> task<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .<span class=\"kw1\">catch<\/span><span class=\"br0\">&#40;<\/span>HandleError<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; update<span class=\"br0\">&#40;<\/span>task<span class=\"sy0\">:<\/span> Task<span class=\"br0\">&#41;<\/span><span class=\"sy0\">:<\/span> Promise<span class=\"sy0\">&lt;<\/span>void<span class=\"sy0\">&gt;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> firstValueFrom<span class=\"br0\">&#40;<\/span><span class=\"kw1\">this<\/span>.<span class=\"me1\">http<\/span>.<span class=\"me1\">put<\/span><span class=\"br0\">&#40;<\/span>`$<span class=\"br0\">&#123;<\/span><span class=\"kw1\">this<\/span>.<span class=\"me1\">taskUrl<\/span><span class=\"br0\">&#125;<\/span><span class=\"sy0\">\/<\/span>$<span class=\"br0\">&#123;<\/span>task.<span class=\"me1\">id<\/span><span class=\"br0\">&#125;<\/span>`<span class=\"sy0\">,<\/span> task<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .<span class=\"kw1\">catch<\/span><span class=\"br0\">&#40;<\/span>HandleError<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; remove<span class=\"br0\">&#40;<\/span>id<span class=\"sy0\">:<\/span> number<span class=\"br0\">&#41;<\/span><span class=\"sy0\">:<\/span> Promise<span class=\"sy0\">&lt;<\/span>void<span class=\"sy0\">&gt;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> firstValueFrom<span class=\"br0\">&#40;<\/span><span class=\"kw1\">this<\/span>.<span class=\"me1\">http<\/span>.<span class=\"kw1\">delete<\/span><span class=\"br0\">&#40;<\/span>`$<span class=\"br0\">&#123;<\/span><span class=\"kw1\">this<\/span>.<span class=\"me1\">taskUrl<\/span><span class=\"br0\">&#125;<\/span><span class=\"sy0\">\/<\/span>$<span class=\"br0\">&#123;<\/span>id<span class=\"br0\">&#125;<\/span>`<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .<span class=\"kw1\">catch<\/span><span class=\"br0\">&#40;<\/span>HandleError<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>We&#8217;ve defined taskUrl as a private element of our service. It contains a url to our REST API. In order to send HTTP requests, we&#8217;ve injected HTTP class into our service.<\/p>\n<p>To insert a new item, we send a POST request to our url with a new task in the body. To update an item, we send a PUT request to url\/item_id. This request also contains an updated task in the body. To remove an item, we send a delete request to url\/item_id. In this case, an item with such an id will be removed.<\/p>\n<p>Now, open &#8220;<strong>link.service.ts<\/strong>&#8221; and update our LinkService.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw5\">import<\/span> <span class=\"br0\">&#123;<\/span> Injectable <span class=\"br0\">&#125;<\/span> from <span class=\"st0\">'@angular\/core'<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw5\">import<\/span> <span class=\"br0\">&#123;<\/span> Link <span class=\"br0\">&#125;<\/span> from <span class=\"st0\">'..\/models\/link'<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw5\">import<\/span> <span class=\"br0\">&#123;<\/span> HttpClient <span class=\"br0\">&#125;<\/span> from <span class=\"st0\">'@angular\/common\/http'<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw5\">import<\/span> <span class=\"br0\">&#123;<\/span> HandleError <span class=\"br0\">&#125;<\/span> from <span class=\"st0\">'.\/service-helper'<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw5\">import<\/span> <span class=\"br0\">&#123;<\/span> firstValueFrom <span class=\"br0\">&#125;<\/span> from <span class=\"st0\">'rxjs'<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"sy0\">@<\/span>Injectable<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"kw5\">export<\/span> <span class=\"kw5\">class<\/span> LinkService <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; private linkUrl <span class=\"sy0\">=<\/span> <span class=\"st0\">'api\/links'<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; constructor<span class=\"br0\">&#40;<\/span>private http<span class=\"sy0\">:<\/span> HttpClient<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"kw1\">get<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">:<\/span> Promise<span class=\"sy0\">&lt;<\/span>Link<span class=\"br0\">&#91;<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">&gt;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> firstValueFrom<span class=\"br0\">&#40;<\/span><span class=\"kw1\">this<\/span>.<span class=\"me1\">http<\/span>.<span class=\"kw1\">get<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw1\">this<\/span>.<span class=\"me1\">linkUrl<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .<span class=\"kw1\">catch<\/span><span class=\"br0\">&#40;<\/span>HandleError<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; insert<span class=\"br0\">&#40;<\/span>link<span class=\"sy0\">:<\/span> Link<span class=\"br0\">&#41;<\/span><span class=\"sy0\">:<\/span> Promise<span class=\"sy0\">&lt;<\/span>Link<span class=\"sy0\">&gt;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> firstValueFrom<span class=\"br0\">&#40;<\/span><span class=\"kw1\">this<\/span>.<span class=\"me1\">http<\/span>.<span class=\"me1\">post<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw1\">this<\/span>.<span class=\"me1\">linkUrl<\/span><span class=\"sy0\">,<\/span> link<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .<span class=\"kw1\">catch<\/span><span class=\"br0\">&#40;<\/span>HandleError<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; update<span class=\"br0\">&#40;<\/span>link<span class=\"sy0\">:<\/span> Link<span class=\"br0\">&#41;<\/span><span class=\"sy0\">:<\/span> Promise<span class=\"sy0\">&lt;<\/span>void<span class=\"sy0\">&gt;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> firstValueFrom<span class=\"br0\">&#40;<\/span><span class=\"kw1\">this<\/span>.<span class=\"me1\">http<\/span>.<span class=\"me1\">put<\/span><span class=\"br0\">&#40;<\/span>`$<span class=\"br0\">&#123;<\/span><span class=\"kw1\">this<\/span>.<span class=\"me1\">linkUrl<\/span><span class=\"br0\">&#125;<\/span><span class=\"sy0\">\/<\/span>$<span class=\"br0\">&#123;<\/span>link.<span class=\"me1\">id<\/span><span class=\"br0\">&#125;<\/span>`<span class=\"sy0\">,<\/span> link<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .<span class=\"kw1\">catch<\/span><span class=\"br0\">&#40;<\/span>HandleError<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; remove<span class=\"br0\">&#40;<\/span>id<span class=\"sy0\">:<\/span> number<span class=\"br0\">&#41;<\/span><span class=\"sy0\">:<\/span> Promise<span class=\"sy0\">&lt;<\/span>void<span class=\"sy0\">&gt;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">return<\/span> firstValueFrom<span class=\"br0\">&#40;<\/span><span class=\"kw1\">this<\/span>.<span class=\"me1\">http<\/span>.<span class=\"kw1\">delete<\/span><span class=\"br0\">&#40;<\/span>`$<span class=\"br0\">&#123;<\/span><span class=\"kw1\">this<\/span>.<span class=\"me1\">linkUrl<\/span><span class=\"br0\">&#125;<\/span><span class=\"sy0\">\/<\/span>$<span class=\"br0\">&#123;<\/span>id<span class=\"br0\">&#125;<\/span>`<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; .<span class=\"kw1\">catch<\/span><span class=\"br0\">&#40;<\/span>HandleError<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>It&#8217;s pretty much the same as TaskService and provides the same API for links.<\/p>\n<p>In the &#8220;gantt.component.ts&#8221; file, we need to add tasks editing logic. Since we import the gantt object from the module to avoid unexpected behavior, we should create a data processor and attach handlers via <strong>attachEvent<\/strong> only once. To ensure that the data processor is created only once each time the gantt is initialized (when switching between application pages), you can add a custom property to the gantt object, for example <strong>(gantt as any).$_initOnce = true<\/strong>.<\/p>\n<p>Next, we check if the gantt has this property. If it doesn&#8217;t, we initialize the gantt for the first time and create a data processor:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span><span class=\"sy0\">!<\/span><span class=\"br0\">&#40;<\/span>gantt as any<span class=\"br0\">&#41;<\/span>.$_initOnce<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#40;<\/span>gantt as any<span class=\"br0\">&#41;<\/span>.$_initOnce <span class=\"sy0\">=<\/span> <span class=\"kw2\">true<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">const<\/span> dp <span class=\"sy0\">=<\/span> gantt.<span class=\"me1\">createDataProcessor<\/span><span class=\"br0\">&#40;<\/span>...<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>If the property exists, then the gantt is already configured, and we need to skip creating the data processor.<\/p>\n<p>If using the Commercial\/Enterprise\/Ultimate licenses of DHTMLX Gantt, we can create a new gantt object (<strong>const gantt = Gantt.getGanttInstance()<\/strong>) and configure it when starting the component (<strong>ngOnInit<\/strong>), and destroy the created gantt (<strong>gantt.destructor()<\/strong>) when exiting the component (<strong>ngOnDestroy<\/strong>). This way, each launch of the component will start with a clean gantt, and the check will not be needed.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;height:600px;\"><div class=\"javascript codecolorer\"><span class=\"kw5\">import<\/span> <span class=\"br0\">&#123;<\/span> Component<span class=\"sy0\">,<\/span> ElementRef<span class=\"sy0\">,<\/span> OnInit<span class=\"sy0\">,<\/span> ViewChild<span class=\"sy0\">,<\/span> ViewEncapsulation <span class=\"br0\">&#125;<\/span> from <span class=\"st0\">'@angular\/core'<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw5\">import<\/span> <span class=\"br0\">&#123;<\/span> TaskService <span class=\"br0\">&#125;<\/span> from <span class=\"st0\">'..\/services\/task.service'<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw5\">import<\/span> <span class=\"br0\">&#123;<\/span> LinkService <span class=\"br0\">&#125;<\/span> from <span class=\"st0\">'..\/services\/link.service'<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw5\">import<\/span> <span class=\"br0\">&#123;<\/span> Task <span class=\"br0\">&#125;<\/span> from <span class=\"st0\">'..\/models\/task'<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw5\">import<\/span> <span class=\"br0\">&#123;<\/span> Link <span class=\"br0\">&#125;<\/span> from <span class=\"st0\">'..\/models\/link'<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"kw5\">import<\/span> <span class=\"br0\">&#123;<\/span> gantt <span class=\"br0\">&#125;<\/span> from <span class=\"st0\">'dhtmlx-gantt'<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp;<br \/>\n<span class=\"sy0\">@<\/span>Component<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; encapsulation<span class=\"sy0\">:<\/span> ViewEncapsulation.<span class=\"me1\">None<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; selector<span class=\"sy0\">:<\/span> <span class=\"st0\">'gantt'<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; styleUrls<span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><span class=\"st0\">'.\/gantt.component.css'<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; providers<span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span>TaskService<span class=\"sy0\">,<\/span> LinkService<span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; template<span class=\"sy0\">:<\/span> `<span class=\"sy0\">&lt;<\/span>div <span class=\"kw5\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;gantt-chart&quot;<\/span><span class=\"sy0\">&gt;&lt;\/<\/span>div<span class=\"sy0\">&gt;<\/span>`<span class=\"sy0\">,<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"kw5\">export<\/span> <span class=\"kw5\">class<\/span> GanttComponent <span class=\"kw5\">implements<\/span> OnInit <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"sy0\">@<\/span>ViewChild<span class=\"br0\">&#40;<\/span><span class=\"st0\">'gantt_here'<\/span><span class=\"sy0\">,<\/span> <span class=\"br0\">&#123;<\/span> <span class=\"kw1\">static<\/span><span class=\"sy0\">:<\/span> <span class=\"kw2\">true<\/span> <span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span> ganttContainer<span class=\"sy0\">!:<\/span> ElementRef<span class=\"sy0\">;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; constructor<span class=\"br0\">&#40;<\/span>private taskService<span class=\"sy0\">:<\/span> TaskService<span class=\"sy0\">,<\/span> private linkService<span class=\"sy0\">:<\/span> LinkService<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp;<br \/>\n&nbsp; &nbsp; ngOnInit<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; gantt.<span class=\"me1\">config<\/span>.<span class=\"me1\">date_format<\/span> <span class=\"sy0\">=<\/span> <span class=\"st0\">'%Y-%m-%d %H:%i'<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; gantt.<span class=\"me1\">init<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw1\">this<\/span>.<span class=\"me1\">ganttContainer<\/span>.<span class=\"me1\">nativeElement<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span><span class=\"sy0\">!<\/span><span class=\"br0\">&#40;<\/span>gantt as any<span class=\"br0\">&#41;<\/span>.$_initOnce<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#40;<\/span>gantt as any<span class=\"br0\">&#41;<\/span>.$_initOnce <span class=\"sy0\">=<\/span> <span class=\"kw2\">true<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">const<\/span> dp <span class=\"sy0\">=<\/span> gantt.<span class=\"me1\">createDataProcessor<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; task<span class=\"sy0\">:<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; update<span class=\"sy0\">:<\/span> <span class=\"br0\">&#40;<\/span>data<span class=\"sy0\">:<\/span> Task<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"kw1\">this<\/span>.<span class=\"me1\">taskService<\/span>.<span class=\"me1\">update<\/span><span class=\"br0\">&#40;<\/span>data<span class=\"br0\">&#41;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; create<span class=\"sy0\">:<\/span> <span class=\"br0\">&#40;<\/span>data<span class=\"sy0\">:<\/span> Task<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"kw1\">this<\/span>.<span class=\"me1\">taskService<\/span>.<span class=\"me1\">insert<\/span><span class=\"br0\">&#40;<\/span>data<span class=\"br0\">&#41;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">delete<\/span><span class=\"sy0\">:<\/span> <span class=\"br0\">&#40;<\/span>id<span class=\"sy0\">:<\/span> any<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"kw1\">this<\/span>.<span class=\"me1\">taskService<\/span>.<span class=\"me1\">remove<\/span><span class=\"br0\">&#40;<\/span>id<span class=\"br0\">&#41;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; link<span class=\"sy0\">:<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; update<span class=\"sy0\">:<\/span> <span class=\"br0\">&#40;<\/span>data<span class=\"sy0\">:<\/span> Link<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"kw1\">this<\/span>.<span class=\"me1\">linkService<\/span>.<span class=\"me1\">update<\/span><span class=\"br0\">&#40;<\/span>data<span class=\"br0\">&#41;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; create<span class=\"sy0\">:<\/span> <span class=\"br0\">&#40;<\/span>data<span class=\"sy0\">:<\/span> Link<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"kw1\">this<\/span>.<span class=\"me1\">linkService<\/span>.<span class=\"me1\">insert<\/span><span class=\"br0\">&#40;<\/span>data<span class=\"br0\">&#41;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">delete<\/span><span class=\"sy0\">:<\/span> <span class=\"br0\">&#40;<\/span>id<span class=\"sy0\">:<\/span> any<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"kw1\">this<\/span>.<span class=\"me1\">linkService<\/span>.<span class=\"me1\">remove<\/span><span class=\"br0\">&#40;<\/span>id<span class=\"br0\">&#41;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; Promise.<span class=\"me1\">all<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#91;<\/span><span class=\"kw1\">this<\/span>.<span class=\"me1\">taskService<\/span>.<span class=\"kw1\">get<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">,<\/span> <span class=\"kw1\">this<\/span>.<span class=\"me1\">linkService<\/span>.<span class=\"kw1\">get<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .<span class=\"me1\">then<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#91;<\/span>data<span class=\"sy0\">,<\/span> links<span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; gantt.<span class=\"me1\">parse<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span> data<span class=\"sy0\">,<\/span> links <span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>Here we&#8217;ve defined a <a href=\"https:\/\/docs.dhtmlx.com\/gantt\/desktop__server_side.html#createdp\" target=\"_blank\" rel=\"noopener\">dataProcessor<\/a> handler that will capture changes made in gantt by the user and will transfer them to data services.<\/p>\n<p>The handler can be declared either as a function or a router object, we&#8217;ve used the latter approach here.<\/p>\n<p>Gantt accepts Promise response from the handler, so the gantt will correctly process the completion of an action.<\/p>\n<p>If your service changes a task or a link id after creating a new record (which it usually does), make sure that your Promise returns an object with {id: databaseId} or {tid: databaseId} as a result, so Gantt could apply new database id to the record.<\/p>\n<p>Keep in mind that in this demo we&#8217;ve used angular-in-memory-api library to emulate the data storage, but in real life you\u2019ll most probably want to save changes to the real database. In order to do that you\u2019ll either need to remove in-memory-web-api from the app, or configure it to <a href=\"https:\/\/github.com\/angular\/in-memory-web-api#passthru\" target=\"_blank\" rel=\"noopener\">pass requests through to the real backend<\/a>, and implement a data storage.<\/p>\n<p>Once again, you are welcome to check a <a href=\"https:\/\/github.com\/DHTMLX\/angular-gantt-demo\" target=\"_blank\" rel=\"noopener\">complete demo of our gantt chart and Angular on GitHub<\/a>.<\/p>\n<p>Thank you in advance and stay tuned for new tutorials!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Note: The information provided in this tutorial is outdated. We are working on a refreshed version, but in the meantime, please follow the relevant step-by-step guide in the DHTMLX &#8230;<\/p>\n","protected":false},"author":2,"featured_media":4327,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[17,71,1,38],"tags":[33,59,20,14,60],"class_list":["post-3963","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-posts-for-codeproject-com","category-tutorials","category-uncategorized","category-visible","tag-all-posts","tag-angular","tag-gantt","tag-tips","tag-integrations-gantt"],"_links":{"self":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/3963","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/comments?post=3963"}],"version-history":[{"count":25,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/3963\/revisions"}],"predecessor-version":[{"id":15153,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/3963\/revisions\/15153"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/media\/4327"}],"wp:attachment":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/media?parent=3963"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/categories?post=3963"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/tags?post=3963"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}