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

Интеграция с Angular

совет

Предполагается знакомство с основными концепциями и паттернами Angular. Для повторения см. документацию Angular.

DHTMLX Pivot интегрируется с Angular как обычный компонент. Для полного рабочего примера см. демо Angular Pivot на GitHub.

Создание проекта

информация

Перед началом установите Angular CLI и Node.js.

Следующая команда создаёт новый Angular-проект с именем my-angular-pivot-app:

ng new my-angular-pivot-app
заметка

При запросе Angular CLI отключите Server-Side Rendering (SSR) и Static Site Generation (SSG/Prerendering) — данное руководство предполагает клиентский рендеринг.

Команда установит все необходимые инструменты. Дополнительные команды не требуются.

Установка зависимостей

Перейдите в директорию нового проекта:

cd my-angular-pivot-app

Установите зависимости и запустите сервер разработки с помощью менеджера пакетов yarn:

yarn
yarn start # или: yarn dev

Приложение должно запуститься на локальном порту (например, http://localhost:3000).

Создание Pivot

Добавьте пакет Pivot в проект, затем оберните Pivot в Angular-компонент.

Шаг 1. Установка пакета

Загрузите ознакомительный пакет Pivot и следуйте инструкциям в README. Ознакомительный пакет Pivot действителен в течение 30 дней.

Шаг 2. Создание компонента

Создайте Angular-компонент, который монтирует Pivot. Добавьте папку pivot в src/app/ и создайте файл src/app/pivot/pivot.component.ts. Затем выполните следующие шаги:

Импорт исходных файлов

Откройте src/app/pivot/pivot.component.ts и импортируйте пакет Pivot. Путь импорта зависит от редакции пакета:

  • PRO-версия (установлена из локальной папки):
import { Pivot } from 'dhx-pivot-package';
  • Ознакомительная версия:
import { Pivot } from '@dhx/trial-pivot';

В этом руководстве используется ознакомительная версия Pivot.

Настройка контейнера и монтирование Pivot

Чтобы отобразить Pivot на странице, определите элемент-контейнер в шаблоне компонента, затем инициализируйте Pivot в хуке ngOnInit с помощью конструктора. Уничтожьте Pivot в хуке ngOnDestroy.

Следующий фрагмент кода определяет минимальный Angular-компонент Pivot:

pivot.component.ts
import { Pivot } from '@dhx/trial-pivot';
import { Component, ElementRef, OnInit, ViewChild, OnDestroy, ViewEncapsulation } from '@angular/core';

@Component({
encapsulation: ViewEncapsulation.None,
selector: "pivot", // имя шаблона, используемое в файле "app.component.ts" как <pivot />
styleUrls: ["./pivot.component.css"], // подключение CSS-файла
template: `<div #container className="widget"></div>`,
})

export class PivotComponent implements OnInit, OnDestroy {
// ссылка на контейнер для Pivot
@ViewChild('container', { static: true }) pivot_container!: ElementRef;

private _table!: Pivot;

ngOnInit() {
// инициализация компонента Pivot
this._table = new Pivot(this.pivot_container.nativeElement, {});
}

ngOnDestroy(): void {
this._table.destructor(); // уничтожение Pivot при размонтировании
}
}

Добавление стилей

Чтобы Pivot отображался корректно, создайте файл src/app/pivot/pivot.component.css со стилями для страницы и контейнера Pivot:

pivot.component.css
/* импорт стилей Pivot */
@import "@dhx/trial-pivot/dist/pivot.css";

/* стили для начальной страницы */
html,
body {
margin: 0;
padding: 0;
height: 100%;
}

/* стили для контейнера Pivot */
.widget {
width: 100%;
height: 100%;
}

Загрузка данных

Чтобы передать данные в Pivot, подготовьте набор данных. Создайте файл src/app/pivot/data.ts и экспортируйте данные и метаданные полей:

data.ts
export function getData() {
const dataset = [
{
"cogs": 51,
"date": "10/1/2018",
"inventory_margin": 503,
"margin": 71,
"market_size": "Major Market",
"market": "Central",
"marketing": 46,
"product_line": "Leaves",
"product_type": "Herbal Tea",
"product": "Lemon",
"profit": -5,
"sales": 122,
"state": "Colorado",
"expenses": 76,
"type": "Decaf"
},
{
"cogs": 52,
"date": "10/1/2018",
"inventory_margin": 405,
"margin": 71,
"market_size": "Major Market",
"market": "Central",
"marketing": 17,
"product_line": "Leaves",
"product_type": "Herbal Tea",
"product": "Mint",
"profit": 26,
"sales": 123,
"state": "Colorado",
"expenses": 45,
"type": "Decaf"
}, // другие элементы данных
];

const fields: any = [
{
"id": "cogs",
"label": "Cogs",
"type": "number"
},
{
"id": "date",
"label": "Date",
"type": "date"
}, // другие поля
];

return { dataset, fields };
};

Откройте src/app/pivot/pivot.component.ts, импортируйте getData и примените набор данных в ngOnInit():

pivot.component.ts
import { Pivot } from '@dhx/trial-pivot';
import { getData } from "./data"; // импорт данных
import { Component, ElementRef, OnInit, ViewChild, OnDestroy, ViewEncapsulation } from '@angular/core';

@Component({
encapsulation: ViewEncapsulation.None,
selector: "pivot",
styleUrls: ["./pivot.component.css"],
template: `<div #container className="widget"></div>`,
})

export class PivotComponent implements OnInit, OnDestroy {
@ViewChild('container', { static: true }) pivot_container!: ElementRef;

private _table!: Pivot;

ngOnInit() {
const { dataset, fields } = getData(); // извлечение данных и метаданных полей
this._table = new Pivot(this.pivot_container.nativeElement, {
fields,
data: dataset,
config: {
rows: ["state", "product_type"],
columns: ["product_line", "type"],
values: [
{
field: "profit",
method: "sum"
}, // другие значения
]
},
// другие свойства конфигурации
});
}

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

Компонент готов к использованию. При монтировании Pivot отрисовывается с переданными данными. Полный список свойств конфигурации см. в документации API Pivot.

Обработка событий

Действия пользователя в Pivot генерируют события, на которые можно подписаться. Полный список событий см. в обзоре событий.

Следующий фрагмент кода расширяет ngOnInit слушателем события open-filter, который выводит в консоль идентификатор поля при открытии фильтра пользователем:

pivot.component.ts
// ...
ngOnInit() {
const { dataset, fields } = getData();
this._table = new Pivot(this.pivot_container.nativeElement, {
fields,
data: dataset,
config: {
rows: ["state", "product_type"],
columns: ["product_line", "type"],
values: [
{
field: "profit",
method: "sum"
}, // другие значения
]
}
});

this._table.api.on("open-filter", (ev) => {
console.log("The field id for which the filter is activated:", ev.id);
});
}

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

Шаг 3. Добавление Pivot в приложение

Чтобы встроить PivotComponent в приложение, откройте src/app/app.component.ts и замените код по умолчанию следующим:

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

@Component({
selector: "app-root",
template: `<pivot/>` // шаблон, созданный в файле "pivot.component.ts"
})
export class AppComponent {
name = "";
}

Затем создайте файл src/app/app.module.ts и зарегистрируйте PivotComponent:

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

import { AppComponent } from "./app.component";
import { PivotComponent } from "./pivot/pivot.component";

@NgModule({
declarations: [AppComponent, PivotComponent],
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));

Запустите приложение, чтобы увидеть отрисовку данных в Pivot на странице.

DHTMLX Pivot, отрендеренный в приложении Angular с демонстрационными данными

Pivot теперь интегрирован с Angular. Настройте конфигурацию в соответствии с требованиями проекта. Итоговый пример см. в angular-pivot-demo на GitHub.