Zum Hauptinhalt springen

Integration mit Angular

Tipp

Grundkenntnisse der Konzepte und Muster von Angular werden vorausgesetzt. Zur Auffrischung lesen Sie die Angular-Dokumentation.

DHTMLX Pivot lässt sich wie eine reguläre Komponente in Angular einbinden. Ein vollständiges, lauffähiges Beispiel finden Sie in der Angular Pivot Demo auf GitHub.

Projekt erstellen

Info

Installieren Sie Angular CLI und Node.js, bevor Sie beginnen.

Der folgende Befehl erstellt ein neues Angular-Projekt mit dem Namen my-angular-pivot-app:

ng new my-angular-pivot-app
Hinweis

Deaktivieren Sie Server-Side Rendering (SSR) und Static Site Generation (SSG/Prerendering), wenn die Angular CLI danach fragt — dieser Guide setzt eine client-seitig gerenderte App voraus.

Der Befehl installiert alle erforderlichen Werkzeuge. Weitere Befehle sind nicht notwendig.

Abhängigkeiten installieren

Wechseln Sie in das neue Projektverzeichnis:

cd my-angular-pivot-app

Installieren Sie die Abhängigkeiten und starten Sie den Entwicklungsserver mit dem Paketmanager yarn:

yarn
yarn start # oder: yarn dev

Die App sollte auf einem lokalen Port erreichbar sein (zum Beispiel http://localhost:3000).

Pivot erstellen

Fügen Sie das Pivot-Paket zum Projekt hinzu und binden Sie Pivot anschließend in eine Angular-Komponente ein.

Schritt 1. Paket installieren

Laden Sie das Pivot-Testpaket herunter und folgen Sie den Anweisungen in der README-Datei. Das Testpaket ist 30 Tage gültig.

Schritt 2. Komponente erstellen

Erstellen Sie eine Angular-Komponente, die Pivot einbindet. Legen Sie einen Ordner pivot unter src/app/ an und erstellen Sie die Datei src/app/pivot/pivot.component.ts. Folgen Sie dann diesen Schritten:

Quelldateien importieren

Öffnen Sie src/app/pivot/pivot.component.ts und importieren Sie das Pivot-Paket. Der Import-Pfad hängt von der Paketedition ab:

  • PRO-Version (aus einem lokalen Ordner installiert):
import { Pivot } from 'dhx-pivot-package';
  • Testversion:
import { Pivot } from '@dhx/trial-pivot';

Dieses Tutorial verwendet die Testversion von Pivot.

Container einrichten und Pivot einbinden

Um Pivot auf der Seite anzuzeigen, definieren Sie ein Container-Element im Component-Template und initialisieren Sie Pivot im ngOnInit-Hook über den Konstruktor. Zerstören Sie Pivot im ngOnDestroy-Hook.

Das folgende Code-Snippet definiert eine minimale Pivot Angular-Komponente:

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", // Template-Name, der in "app.component.ts" als <pivot /> verwendet wird
styleUrls: ["./pivot.component.css"], // CSS-Datei einbinden
template: `<div #container className="widget"></div>`,
})

export class PivotComponent implements OnInit, OnDestroy {
// Container-Referenz für Pivot
@ViewChild('container', { static: true }) pivot_container!: ElementRef;

private _table!: Pivot;

ngOnInit() {
// Pivot-Komponente initialisieren
this._table = new Pivot(this.pivot_container.nativeElement, {});
}

ngOnDestroy(): void {
this._table.destructor(); // Pivot beim Entfernen zerstören
}
}

Stile hinzufügen

Damit Pivot korrekt gerendert wird, erstellen Sie src/app/pivot/pivot.component.css mit Stilen für die Seite und den Pivot-Container:

pivot.component.css
/* Pivot-Stile importieren */
@import "@dhx/trial-pivot/dist/pivot.css";

/* Stile für die Startseite */
html,
body {
margin: 0;
padding: 0;
height: 100%;
}

/* Stile für den Pivot-Container */
.widget {
width: 100%;
height: 100%;
}

Daten laden

Um Pivot mit Daten zu versorgen, bereiten Sie einen Datensatz vor. Erstellen Sie src/app/pivot/data.ts und exportieren Sie die Daten sowie die Feld-Metadaten:

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"
}, // weitere Datensätze
];

const fields: any = [
{
"id": "cogs",
"label": "Cogs",
"type": "number"
},
{
"id": "date",
"label": "Date",
"type": "date"
}, // weitere Felder
];

return { dataset, fields };
};

Öffnen Sie src/app/pivot/pivot.component.ts, importieren Sie getData und wenden Sie den Datensatz in ngOnInit() an:

pivot.component.ts
import { Pivot } from '@dhx/trial-pivot';
import { getData } from "./data"; // Daten importieren
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(); // Daten und Feld-Metadaten entpacken
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"
}, // weitere Werte
]
},
// weitere Konfigurationseigenschaften
});
}

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

Die Komponente ist jetzt einsatzbereit. Beim Einbinden rendert Pivot die übergebenen Daten. Die vollständige Liste der Konfigurationseigenschaften finden Sie in der Pivot API-Dokumentation.

Events behandeln

Benutzeraktionen in Pivot lösen Events aus, die Sie abonnieren können. Die vollständige Liste der Events finden Sie in der Events-Übersicht.

Das folgende Code-Snippet erweitert ngOnInit um einen open-filter-Event-Listener, der die Feld-ID protokolliert, wenn ein Benutzer einen Filter öffnet:

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"
}, // weitere Werte
]
}
});

this._table.api.on("open-filter", (ev) => {
console.log("Die Feld-ID, für die der Filter aktiviert wird:", ev.id);
});
}

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

Schritt 3. Pivot zur App hinzufügen

Um PivotComponent in die App einzubetten, öffnen Sie src/app/app.component.ts und ersetzen Sie den Standardcode durch Folgendes:

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

@Component({
selector: "app-root",
template: `<pivot/>` // Template, das in "pivot.component.ts" erstellt wurde
})
export class AppComponent {
name = "";
}

Erstellen Sie dann src/app/app.module.ts und registrieren Sie 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 {}

Öffnen Sie abschließend src/main.ts und ersetzen Sie den Inhalt durch folgenden Bootstrap-Code:

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

Starten Sie die App, um zu sehen, wie Pivot die Daten auf der Seite rendert.

In einer Angular-Anwendung gerendertes DHTMLX Pivot mit Beispieldaten

Pivot ist nun in Angular integriert. Passen Sie die Konfiguration an die Anforderungen Ihres Projekts an. Das vollständige Beispiel finden Sie in der angular-pivot-demo auf GitHub.