Erstellen Sie ein responsives Dashboard mit Angular Material und ng2-Charts

Veröffentlicht: 2022-03-10
Kurze Zusammenfassung ↬ Schematics in Angular 9 sind Code-Generatoren, die Komponenten und Muster in Projekten mit vorgegebenen Vorlagen und Layouts erstellen können. In diesem Artikel erklärt Zara Cooper, wie Sie Schemata in Angular Material und ng2-Charts nutzen können, um den Zeit- und Arbeitsaufwand für die Erstellung eines Dashboards erheblich zu reduzieren.

Das Erstellen eines Dashboards von Grund auf ist oft ziemlich kompliziert. Sie müssen Tools erstellen, um Daten zu interessanten Objekten zu sammeln. Nach der Erfassung müssen diese Daten Ihren Benutzern auf leicht verständliche und aussagekräftige Weise präsentiert werden. Es erfordert eine komplizierte Planung, welche Daten enthalten sein sollen und wie sie effektiv angezeigt werden können. Sobald Sie einen Plan haben, ist die Umsetzung des Designs eine gewaltige Aufgabe, zumal es den Bau mehrerer Komponenten beinhaltet.

Mit Angular Material und ng2-charts können Sie Schemata nutzen, um den Aufwand und die Zeit zu reduzieren, die Sie möglicherweise für die Erstellung eines Dashboards aufwenden. Angular Material wird mit einer Reihe von Schemata geliefert, die Sie zum Erstellen eines Dashboards verwenden können. In ähnlicher Weise bietet ng2-charts Schemata zum Generieren mehrerer Diagrammkomponenten. In diesem Artikel werde ich veranschaulichen, wie man sowohl ng2-charts als auch Angular Material verwendet, um relativ schnell ein Dashboard einzurichten.

Ein Beispiel

Um zu veranschaulichen, wie ein Dashboard erstellt wird, nehmen wir das Beispiel eines Online-Shops, der Lederwaren wie Taschen, Brieftaschen, Schlüsselhalter usw. verkauft. Der Ladenbesitzer möchte unter anderem Informationen darüber verfolgen, woher Kunden in ihren Online-Shop kommen, wie sich ihre Produkte verkaufen, wie Verkehrsquellen mit Verkäufen zusammenhängen.

Wir erstellen ein Dashboard, um diese Informationen anzuzeigen und dem Ladenbesitzer bei der Analyse zu helfen. Das Dashboard enthält vier kleine Übersichtskarten, vier verschiedene Arten von Diagrammen und eine Tabelle mit den zuletzt getätigten Bestellungen. Die vier Übersichtskarten zeigen Informationen wie den Gesamtumsatz aus Verkäufen, den durchschnittlichen Bestellwert, die Gesamtzahl der Bestellungen und die Anzahl der wiederkehrenden Kunden an. Die Diagramme zeigen die Anzahl der verkauften Einheiten für jedes Produkt, die Verkäufe nach Verkehrsquelle, Online-Shop-Sitzungen im Laufe der Zeit und die Verkäufe für die Woche.

Voraussetzungen

Um mitzumachen, muss Angular CLI installiert sein. Wenn Sie es nicht installiert haben, können Sie unter cli.angular.io herausfinden, wie Sie es erhalten. Wenn Sie nicht von einem bereits vorhandenen Angular-Projekt ausgehen, müssen Sie eines generieren, indem Sie ng new <your project name> . Um beispielsweise ein Admin-Panel für den oben genannten Shop zu erstellen, führen wir Folgendes aus:

 ng new store-admin-panel

Für Ihr Projekt müssen auch Routen konfiguriert sein. Wenn Sie von einer neuen App aus starten, wählen Sie Ja aus, wenn Sie gefragt werden, ob Sie während Ihrer Projekteinrichtung oben ein Angular Routing-Modul hinzufügen möchten.

Mehr nach dem Sprung! Lesen Sie unten weiter ↓

Fügen Sie Ihrem Projekt Angular Material und Ng2-Charts hinzu

Angular Material wird mit verschiedenen Schemata zum Generieren einer Vielzahl nützlicher Komponenten wie Adressbücher, Bäume, Tabellen, Navigation usw. geliefert. Um Winkelmaterial zu Ihrem Projekt hinzuzufügen, führen Sie Folgendes aus:

 ng add @angular/material

Wählen Sie ein Design aus den Optionen aus, die in den nachfolgenden Eingabeaufforderungen bereitgestellt werden. Als Nächstes werden Sie aufgefordert, auszuwählen, ob Sie Angular Material-Typografiestile und Browseranimationen hinzufügen möchten. Sie brauchen diese nicht und könnten einfach mit Nein antworten.

Als nächstes müssen Sie ng2-charts installieren. ng2-charts benötigt charts.js als Abhängigkeit. Um ng2-charts zu installieren, führen Sie Folgendes aus:

 npm install ng2-charts --save

Dann installiere charts.js:

 npm install chart.js --save

Um auf die Diagramme zuzugreifen, fügen Sie das ChartsModule den AppModule ChartsModule

 import { ChartsModule } from 'ng2-charts'; @NgModule({ imports: [ … ChartsModule, … ] })

Zuletzt installieren Sie ng2-charts schemes als Dev-Abhängigkeit, da sie standardmäßig nicht mit ng2-charts ausgeliefert werden.

 npm install --save-dev ng2-charts-schematics

Generieren einer Navigationskomponente

Zunächst einmal müssen wir eine Navigationskomponente hinzufügen, damit Benutzer bequem durch die App manövrieren können. Die Navigation sollte Links zum Dashboard und anderen Seiten enthalten, die Teil des Admin-Panels sein werden. Winkelmaterial stellt ein Schema bereit, das eine Navigationskomponente generiert. Wir nennen diese Komponente nav . Das Hinzufügen eines seitlichen Navigationssystems zur Anwendung erfolgt durch Ausführen von:

 ng generate @angular/material:navigation nav

Um andere Routen in der Navigation zu verlinken, verwenden Sie die routerLink Direktive und ändern Sie den Seitennamen in der Symbolleiste, je nachdem, auf welcher Route sich ein Benutzer befindet.

 // nav.component.ts ... menuItems = ['dashboard', 'sales', 'orders', 'customers', 'products'];
 <!--nav.component.html--> ... <mat-nav-list> <a *ngFor="let item of menuItems" mat-list-item [routerLink]="'/'+item"> {{item | titlecase}} </a> ...

Um diese Komponente anzuzeigen, fügen Sie sie zu app.component.html .

 <!--app.component.html--> <app-nav></app-nav>

So sieht die NavComponent aus.

Navigationskomponente
Navigationskomponente (große Vorschau)

Da das Navi zusammen mit anderen Komponenten angezeigt wird, würde das Hinzufügen eines router-outlet dazu beitragen, zwischen den anderen verschiedenen Komponenten umzuschalten. Ersetzen Sie in der Vorlage nav.component.html direkt nach dem schließenden </mat-toolbar> > den Kommentar <!-- Add Content Here --> durch <router-outlet></router-outlet> .

 <!--nav.component.html--> <mat-sidenav-container> ... <mat-sidenav-content> <mat-toolbar> ... </mat-toolbar> <router-outlet></router-outlet> </mat-sidenav-content> </mat-sidenav-container>

In den folgenden Screenshots in diesem Artikel wird diese Navigationskomponente weggelassen, um das Dashboard, das wir für das Tutorial erstellen werden, besser hervorzuheben. Wenn Sie beim Erstellen dieses Dashboards mitmachen, wird das Navigationssystem weiterhin wie oben abgebildet in Ihrem Browser mit dem darin enthaltenen Dashboard angezeigt.

Generieren Sie das Dashboard

Der wichtigste Teil des Dashboards ist sein Layout. Es muss alle zuvor erwähnten Komponenten enthalten und reaktionsfähig sein, wenn es auf verschiedenen Geräten angezeigt wird. Um das Dashboard-Layout zu generieren, müssen Sie das Schema @angular/material:dashboard ausführen. Es wird eine responsive Dashboard-Komponente generiert. Übergeben Sie den bevorzugten Namen für Ihr Dashboard an den Schaltplan. Nennen wir es in diesem Fall dash .

 ng generate @angular/material:dashboard dash

Um das neu generierte Dashboard innerhalb der Navigationskomponente anzuzeigen, fügen Sie dem Router eine Route dafür hinzu.

 // app-routing.module.ts import { DashComponent } from './dash/dash.component'; const routes: Routes = [{ path: 'dashboard', component: DashComponent }]; @NgModule({ imports: [RouterModule.forRoot(routes)], exports: [RouterModule] })

Wenn Sie fertig sind, führen Sie zum Anzeigen der Ergebnisse npm start aus und gehen Sie zu localhost:4200/dashboard . Sie sollten dies sehen:

generierte Dashboard-Komponente
Generierte Dashboard-Komponente (große Vorschau)

Der Schaltplan generiert vier Karten in der Vorlage und zeigt sie in einem responsiven Raster an. Das Angular Material CDK verwendet das Layout -Paket, um dieses responsive Kartenraster zu gestalten. Das Dienstprogramm BreakpointObserver des Layout -Pakets bewertet Medienabfragen und nimmt darauf basierend Änderungen an der Benutzeroberfläche vor. Es sind verschiedene Haltepunkte verfügbar, aber innerhalb der generierten Komponente werden nur zwei Kategorien berücksichtigt. Breakpoints.Handset und andere Abfragen, die nicht damit übereinstimmen. Das Layout -Paket gibt 14 Breakpoint-Zustände an, mit denen Sie die Reaktionsfähigkeit Ihres Dashboards anpassen können.

 // dashboard.component.js ... cards = this.breakpointObserver.observe(Breakpoints.Handset).pipe( map(({ matches }) => { if (matches) { ... } ... }) );

Zurück zum Dashboard: Da sich auf dem Dashboard vier Zusammenfassungskarten, vier Diagramme und eine Tabelle befinden, benötigen wir insgesamt neun Karten. Breakpoints.Handset und Breakpoints.Tablet -Übereinstimmungen werden in einem einspaltigen Raster angezeigt, wobei:

  • Die vier Zusammenfassungskarten erstrecken sich über eine Reihe.
  • Die Diagramme erstrecken sich über zwei Zeilen.
  • Die Tabelle erstreckt sich über vier Zeilen.

Non- Breakpoints.Handset und Non- Breakpoints.Tablet Übereinstimmungen werden in vier Spalten angezeigt, wobei:

  • Die vier Zusammenfassungskarten erstrecken sich über eine Zeile und eine Spalte.
  • Die Diagramme erstrecken sich über zwei Zeilen und zwei Spalten.
  • Die Tabelle umfasst vier Zeilen und vier Spalten.

Bei Nicht- Breakpoints.Handset und Nicht- Breakpoints.Tablet Übereinstimmungen sollte es in etwa so aussehen wie im folgenden Screenshot. Bei Breakpoints.Handset und Breakpoints.Tablet Übereinstimmungen wird alles nur in einer Spalte angezeigt.

Dashboard-Komponente mit zusätzlichen Karten
Dashboard-Komponente mit zusätzlichen Karten (große Vorschau)

Erstellen Sie eine Kartenkomponente

In der Dashboard-Komponente werden alle Karten durch Iteration generiert. Um Wiederholungen zu vermeiden, erstellen wir beim Hinzufügen aller neuen Komponenten eine wiederverwendbare Kartenkomponente. Die Kartenkomponente akzeptiert einen Titel als Eingabe und verwendet ng-content , um den Rest des Inhalts dynamisch hinzuzufügen. Führen Sie zum Erstellen der Kartenkomponente Folgendes aus:

 ng gc card -m app --style css

Aus der Dashboard-Komponentenvorlage nehmen wir einfach das im <mat-card> -Tag eingeschlossene Markup und platzieren es in der Kartenvorlage:

 <!--card.component.html--> <mat-card class="dashboard-card"> <mat-card-header> <mat-card-title> {{title}} <button mat-icon-button class="more-button" [matMenuTriggerFor]="menu" aria-label="Toggle menu"> <mat-icon>more_vert</mat-icon> </button> <mat-menu #menu="matMenu" xPosition="before"> <button mat-menu-item>Expand</button> <button mat-menu-item>Remove</button> </mat-menu> </mat-card-title> </mat-card-header> <mat-card-content class="dashboard-card-content"> <ng-content></ng-content> </mat-card-content> </mat-card>

So fügen Sie den Titel als Eingabe zur Karte hinzu:

 // card.component.ts import { Component, Input } from '@angular/core'; ... export class CardComponent{ @Input() title: string; ... }

So gestalten Sie die Karte:

 /*card.component.css*/ .more-button { position: absolute; top: 5px; right: 10px; } .dashboard-card { position: absolute; top: 15px; left: 15px; right: 15px; bottom: 15px; } .dashboard-card-content { text-align: center; flex-grow: 1; display: flex; flex-direction: column; align-items: center; max-height: 100%; justify-content: center; align-items: stretch; } mat-card { display: flex; flex-direction: column; }

Hinzufügen von Karten zum Dashboard

Da die Dashboard-Elemente einzeln und nicht durch Iteration hinzugefügt werden, muss die Dashboard-Komponente modifiziert werden, um dies zu berücksichtigen. Entfernen Sie in dashboard.component.ts die Eigenschaft cards und ersetzen Sie sie stattdessen durch eine Eigenschaft cardLayout . Die cardLayout Variable definiert die Anzahl der Spalten für die Materialrasterliste und wie viele Zeilen und Spalten sich jede der Dashboard-Karten erstrecken wird. Breakpoints.Handset und Breakpoints.Tablet -Abfrageübereinstimmungen werden in 1 Spalte angezeigt, und diejenigen, die nicht übereinstimmen, werden in 4 Spalten angezeigt.

 // dashboard.component.js ... cardLayout = this.breakpointObserver.observe(Breakpoints.Handset).pipe( map(({ matches }) => { if (matches) { return { columns: 1, miniCard: { cols: 1, rows: 1 }, chart: { cols: 1, rows: 2 }, table: { cols: 1, rows: 4 }, }; } return { columns: 4, miniCard: { cols: 1, rows: 1 }, chart: { cols: 2, rows: 2 }, table: { cols: 4, rows: 4 }, }; }) ); ...

Ersetzen Sie in der Vorlage dash.component.html die Werte colspan und rowspan der Elemente mat-grid-tile und die Eigenschaft cols des Elements mat-grid-list .

 <!--dash.component.html--> <div class="grid-container"> <h1 class="mat-h1">Dashboard</h1> <mat-grid-list cols="{{ ( cardLayout | async )?.columns }}" rowHeight="200px"> <!--Mini Cards--> <mat-grid-tile *ngFor="let i of [1, 2, 3, 4]" [colspan]="( cardLayout | async )?.miniCard.cols" [rowspan]="( cardLayout | async )?.miniCard.rows"> <app-card title="Card {{i}}"><div>Mini Card Content Here</div></app-card> </mat-grid-tile> <!--Charts--> <mat-grid-tile *ngFor="let i of [5, 6, 7, 8]" [colspan]="( cardLayout | async )?.chart.cols" [rowspan]="( cardLayout | async )?.chart.rows"> <app-card title="Card {{i}}"><div>Chart Content Here</div></app-card> </mat-grid-tile> <!--Table--> <mat-grid-tile [colspan]="( cardLayout | async )?.table.cols" [rowspan]="( cardLayout | async )?.table.rows"> <app-card title="Card 9"><div>Table Content Here</div></app-card> </mat-grid-tile> </mat-grid-list> </div>

Das Dashboard sieht am Ende genauso aus wie der neueste Screenshot, der oben verlinkt ist.

Erstellen der Diagramme

Die vier Diagramme, die wir für das Dashboard benötigen, sind:

  • Ein Radardiagramm der Produkte nach verkaufter Einheit.
  • Ein Tortendiagramm der Verkäufe nach Traffic-Quelle.
  • Ein Balkendiagramm der Online-Shop-Sitzungen.
  • Ein Liniendiagramm der Verkäufe im Laufe des Jahres.

Ähnlich wie beim Erstellen des Dashboards beinhaltet das Generieren von Diagrammkomponenten das Ausführen eines Schaltplans. Erstellen Sie mithilfe der ng2-Charts-Schaltpläne die vier verschiedenen Diagramme. Wir legen sie in einem Ordner namens Diagramme ab. Führen Sie ng generate ng2-charts-schematics:<chart type> <chart name> .

 ng generate ng2-charts-schematics:radar charts/product-sales-chart ng generate ng2-charts-schematics:pie charts/sales-traffic-chart ng generate ng2-charts-schematics:line charts/annual-sales-chart ng generate ng2-charts-schematics:bar charts/store-sessions-chart

Nach dem Ausführen dieser Befehle werden alle vier Diagrammkomponenten generiert und mit anzeigebereiten Beispieldaten gefüllt. Wählen Sie abhängig davon, welche Daten Sie anzeigen möchten, Diagramme aus, die Ihren Anforderungen an die Datenvisualisierung am besten entsprechen. Fügen Sie für jedes der oben generierten Diagramme die Klasse chartContainer zu den div s hinzu, die das canvas -Element in den Diagrammvorlagen einschließen.

 <div class="chartContainer"> <canvas baseChart width="400" height="400"> ...

Fügen Sie als Nächstes dieses Styling zu styles.css , damit alle Diagrammkomponenten darauf zugreifen können.

 /*styles.css*/ ... .chartContainer canvas { max-height: 250px; width: auto; } .chartContainer{ height: 100%; display: flex; flex-direction: column; align-items: center; justify-content: center; }

Hinzufügen von Daten zu den Diagrammen

Die generierten Diagrammkomponenten werden mit bereits eingefügten Beispieldaten geliefert. Wenn Sie bereits vorhandene Dienste haben, die Ihre eigenen Daten bereitstellen, können Sie diese Daten von diesen zu den Diagrammkomponenten hinzufügen. Die Diagramme enthalten Beschriftungen für die X-Achse, Daten oder Datensätze, einen Diagrammtyp, Farben, eine Legende sowie andere Anpassungsoptionen. Um die Daten und Bezeichnungen für die Diagramme bereitzustellen, erstellen Sie einen Dienst, der Daten aus einer Quelle Ihrer Wahl abruft und sie in einer Form zurückgibt, die von den Diagrammen akzeptiert wird. Beispielsweise erhält die AnnualSalesChartComponent ihren Datensatz und ihre Bezeichnungen von der SalesService -Methode von getSalesByMonth , die ein Array von Verkäufen für jeden Monat für das aktuelle Jahr zurückgibt. Sie finden diesen Dienst hier und die Daten, die er zurückgibt, hier. Fügen Sie den Dienst als private Eigenschaft in den AnnualSalesChartComponent Konstruktor ein. Rufen Sie die Methode auf, die die erforderlichen Diagrammdaten vom Dienst innerhalb des Lebenszyklus- ngOnInit .

 // annual-sales-chart.component.ts import { SalesService } from 'src/app/sales/sales.service'; ... export class AnnualSalesChartComponent implements OnInit { public salesChartData: ChartDataSets[] = [ { data: [], label: 'Total Sales' }, ]; public salesChartLabels: Label[] = []; ... constructor(private salesService: SalesService) { } ngOnInit() { this.salesService.getSalesByMonth().subscribe({ next: salesItems => { salesItems.forEach(li => { this.salesChartData[0].data.push(li.revenue); this.salesChartLabels.push(li.month); }); }, ... }); } }

Hinzufügen von Diagrammen zum Dashboard

Der nächste Schritt beinhaltet das Hinzufügen der Diagramme zum Dashboard in dash.component.html . So sieht das aus:

 <!--dash.component.html--> ... <!--Charts--> <mat-grid-tile [colspan]="( cardLayout | async )?.chart.cols" [rowspan]="( cardLayout | async )?.chart.rows"> <app-card title="Monthly Revenue"> <app-annual-sale-chart></app-annual-sale-chart> </app-card> </mat-grid-tile> <mat-grid-tile [colspan]="( cardLayout | async )?.chart.cols" [rowspan]="( cardLayout | async )?.chart.rows"> <app-card title="Product Sales"> <app-product-sales-chart></app-product-sales-chart> </app-card> </mat-grid-tile> <mat-grid-tile [colspan]="( cardLayout | async )?.chart.cols" [rowspan]="( cardLayout | async )?.chart.rows"> <app-card title="Sales by Traffic Source"> <app-sales-traffic-chart></app-sales-traffic-chart> </app-card> </mat-grid-tile> <mat-grid-tile [colspan]="( cardLayout | async )?.chart.cols" [rowspan]="( cardLayout | async )?.chart.rows"> <app-card title="Online Store Sessions by Traffic Source"> <app-store-sessions-chart></app-store-sessions-chart> </app-card> </mat-grid-tile> ...

So sieht das resultierende responsive Dashboard aus.

Dashboard mit Diagrammen
Dashboard mit Diagrammen (große Vorschau)

Generieren einer Tabelle

Wir fügen eine Bestelltabelle hinzu, um dem Shop-Betreiber einen Überblick über die zuletzt aufgegebenen Bestellungen und deren Status zu geben. Führen Sie zum Generieren der Auftragstabellenkomponente das Schema aus:

 ng generate @angular/material:table orders-table

Dadurch wird eine Tabellenkomponente generiert, die wie folgt aussieht.

Tabelle generiert durch Angular Material Schema
Tabelle generiert durch Angular Material Schema (große Vorschau)

Tabellen mit vielen Spalten lassen sich möglicherweise nur schwer für Mobilteil- und Tablet-Ansichten responsive machen. Wenn Sie die Tabelle zu einer Karte hinzufügen, machen Sie sie horizontal scrollbar, damit alle Daten richtig angezeigt werden können und nicht behindert werden. Sie können dies tun, indem Sie Ihrer Tabellenkomponente den folgenden Stil hinzufügen:

 <!--table.component.html--> <div class="mat-elevation-z8 small-table"> <table mat-table class="full-width-table" matSort aria-label="Elements"> ...
 /*table.component.css*/ ... .small-table{ overflow-x: scroll !important; }

So fügen Sie die Tabelle zur Bindestrichkomponente hinzu:

 <!-- dashboard.component.html> ... <mat-grid-tile [colspan]="( cardLayout | async )?.table.cols" [rowspan]="( cardLayout | async )?.table.rows"> <app-card title="Latest Orders"> <app-orders-table></app-orders-table> </app-card> </mat-grid-tile> ...

Hinzufügen von Daten zur Tabelle

Wie bei Diagrammen können Sie der Tabelle in der ngOnInit Methode Daten aus einem Dienst hinzufügen. Darüber hinaus müssen Sie die generierte Datenquelle Ihrer Tabelle ändern, um Daten aus dem Dienst zu nutzen. Fügen Sie zunächst den Dienst in den Klassenkonstruktor der Tabelle ein. Nehmen wir das Beispiel einer Tabelle, die die letzten Bestellungen für dieses Dashboard auflistet. Um Daten für die Tabelle abzurufen, fügen wir den OrderService in den OrdersTableComponent Konstruktor ein, ändern die Assertion des Typs MatTable des Tabellenansichts-Kindes und ergänzen die Liste der angezeigten Spalten, um eine Bestellschnittstelle widerzuspiegeln. Wenn Sie an den Daten interessiert sind, die der Tabelle hinzugefügt werden, finden Sie sie hier. Als letztes muss die Gesamtlänge der verfügbaren Datenelemente abgerufen werden, um die Gesamtlänge im <mat-paginator> der Tabelle festzulegen.

 // orders-table.component.ts import { OrderService } from '../orders.service'; import { Order } from '../order'; ... export class OrdersTableComponent implements AfterViewInit, OnInit { ... @ViewChild(MatTable) table: MatTable ; dataLength: number; displayedColumns = [ "id", "date", "name", "status", "orderTotal", "paymentMode", ]; ... constructor(private orderService: OrderService){} ngOnInit() { this.datasource = new OrdersTableDataSource(this.orderService); this.orderService.getOrderCount().subscribe({ next: orderCount => { this.dataLength = orderCount; }, ... }); } ... } // orders-table.component.ts import { OrderService } from '../orders.service'; import { Order } from '../order'; ... export class OrdersTableComponent implements AfterViewInit, OnInit { ... @ViewChild(MatTable) table: MatTable ; dataLength: number; displayedColumns = [ "id", "date", "name", "status", "orderTotal", "paymentMode", ]; ... constructor(private orderService: OrderService){} ngOnInit() { this.datasource = new OrdersTableDataSource(this.orderService); this.orderService.getOrderCount().subscribe({ next: orderCount => { this.dataLength = orderCount; }, ... }); } ... }

Als Nächstes müssen wir die OrdersTableDataSource -Klasse ändern, um den OrderService als Parameter in ihrem Konstruktor zu akzeptieren. Wir müssen auch die Methoden zum connect und destroy ändern. Die connect -Methode verbindet die Datenquelle mit der Tabelle und aktualisiert die Tabelle, wenn neue Datenelemente aus dem Stream ausgegeben werden, den sie zurückgibt, in diesem Fall ein beobachtbares Order-Array. Die dataMutations Konstante kombiniert die ersten Datenlade-, Paginierungs- und Sortierereignisse in einem Stream, den die Tabelle verarbeiten kann. Paginierung und Sortierung werden serverseitig vom OrderService . Also müssen wir den Offset und die Seitengröße vom Paginator und das aktive Sortierfeld und die Sortierrichtung der Eigenschaft sort an die Methode getOrders des OrderService . Die Methode disconnect sollte verwendet werden, um alle hergestellten Verbindungen zu schließen und Ressourcen freizugeben, die in der Methode connect zurückgehalten wurden.

 // orders-table.datasource.ts ... export class OrdersTableDataSource extends DataSource<Order> { paginator: MatPaginator; sort: MatSort; constructor(private orderService: OrderService) { super(); } connect(): Observable<Order[]> { const dataMutations = [ of('Initial load'), this.paginator.page, this.sort.sortChange ]; return merge(...dataMutations).pipe(mergeMap(() => { return this.orderService.getOrders( this.paginator.pageIndex * this.paginator.pageSize, this.paginator.pageSize, this.sort.active, this.sort.direction ); })); } disconnect() {} }

Fügen Sie in der Tabellenvorlage „orders“ die neuen Spalten ein und binden Sie die length -Eigenschaft von <mat-paginator> an die dataLength -Eigenschaft. Verwenden Sie für die Statusspalte ein <mat-chip> -Element zur besseren Visualisierung des Bestellstatus. Um Zugriff auf <mat-chip> zu haben, fügen Sie das MatChipsModule als Import zu AppModule .

 <!-- orders-table.component.html --> <div class="mat-elevation-z8"> <table mat-table class="full-width-table" matSort aria-label="Elements"> <!-- Id Column --> <ng-container matColumnDef="id"> <th mat-header-cell *matHeaderCellDef mat-sort-header>Id</th> <td mat-cell *matCellDef="let row">{{row.id}}</td> </ng-container> <!-- Date Column --> <ng-container matColumnDef="date"> <th mat-header-cell *matHeaderCellDef mat-sort-header>Date</th> <td mat-cell *matCellDef="let row">{{row.date | date }}</td> </ng-container> <!-- Name Column --> <ng-container matColumnDef="name"> <th mat-header-cell *matHeaderCellDef mat-sort-header>Name</th> <td mat-cell *matCellDef="let row">{{row.name}}</td> </ng-container> <!-- Order Total Column --> <ng-container matColumnDef="orderTotal"> <th mat-header-cell *matHeaderCellDef mat-sort-header>Order Total</th> <td mat-cell *matCellDef="let row">{{row.orderTotal | currency}}</td> </ng-container> <!-- Payment Mode Column --> <ng-container matColumnDef="paymentMode"> <th mat-header-cell *matHeaderCellDef mat-sort-header>Payment Mode</th> <td mat-cell *matCellDef="let row">{{row.paymentMode}}</td> </ng-container> <!-- Status Column --> <ng-container matColumnDef="status"> <th mat-header-cell *matHeaderCellDef mat-sort-header>Status</th> <td mat-cell *matCellDef="let row"> <mat-chip-list> <mat-chip color="{{ row.status == 'delivered' ? 'primary' : ( row.status == 'shipped' ? 'accent' : 'warn' ) }}" selected> {{row.status}} </mat-chip> </mat-chip-list> </td> </ng-container> <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr> <tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr> </table> <mat-paginator #paginator [length]="dataLength" [pageIndex]="0" [pageSize]="5" [pageSizeOptions]="[5, 10, 15, 20]"> </mat-paginator> </div>

Sobald Daten zur Tabelle hinzugefügt wurden, sieht das Dashboard so aus:

Dashboard mit Diagrammen und Tabelle
Dashboard mit Diagrammen und Tabelle (große Vorschau)

Erstellen einer Mini Card-Komponente

Alles, was übrig bleibt, um das Dashboard zu vervollständigen, ist, die vier kleinen Karten zu füllen, die sich oben befinden. Kleinere Übersichtskarten als Teil des Dashboards machen es einfach, kurze Informationen hervorzuheben, die keine ganzen Diagramme oder Tabellen benötigen. In diesem Beispiel zeigen die vier Minikarten den Gesamtumsatz, den durchschnittlichen Bestellwert, die Gesamtzahl der Bestellungen und die Anzahl der wiederkehrenden Kunden an, die das Geschäft an diesem Tag besucht haben. Dies ist nur ein Beispiel. Diese Minikarten können nicht wie bei der Navigation, dem Dashboard-Layout, den Diagrammen und der Tabelle generiert werden. Sie haben keine Schaltpläne. Im Folgenden gehen wir kurz darauf ein, wie man sie erstellt. Obwohl wir für das Beispiel spezifische Daten hinzufügen werden, können Sie ihnen hinzufügen, was Sie möchten, oder sich dafür entscheiden, sie ganz zu entfernen. Generieren Sie zunächst die mini-card Komponente und führen Sie Folgendes aus:

 ng gc mini-card -m app --style css

Die Vorlage für die hier verlinkte Komponente und ihr Styling finden Sie hier. Diese Komponente hat acht Eingabeeigenschaften, die Sie hier hinzufügen können. Um Daten an die Minicard-Komponenten zu übertragen, fügen Sie den Dienst, der ihnen Daten bereitstellt, in den DashComponent Konstruktor ein. Weisen Sie vom Dienst empfangene Daten einer Eigenschaft der DashComponent . In diesem Fall erhalten wir Daten vom StoreSummaryService und weisen sie der miniCardData Eigenschaft zu. Hier ist wie:

 // dash.component.ts export class DashComponent implements OnInit{ ... miniCardData: StoreSummary[]; constructor(private breakpointObserver: BreakpointObserver, private summaryService: StoreSummaryService) {} ngOnInit() { this.summaryService.getStoreSummary().subscribe({ next: summaryData => { this.miniCardData = summaryData; } }); } }

So fügen Sie die mini-cards Komponente hinzu und lassen sie mit Daten aus dem Dienst auffüllen:

 <!--dash.component.html--> ... <!--Mini Cards--> <mat-grid-tile *ngFor="let mc of miniCardData" [colspan]="( cardLayout | async )?.miniCard.cols" [rowspan]="( cardLayout | async )?.miniCard.rows"> <app-mini-card [title]="mc.title" [textValue]="mc.textValue" [value]="mc.value" [color]="mc.color" [percentValue]="mc.percentValue"></app-mini-card> </mat-grid-tile> ...

Der folgende Screenshot zeigt, wie das Dashboard mit den gefüllten Minikarten aussehen wird.

Dashboard mit Diagrammen, Tabellen und Minikarten
Dashboard mit Diagrammen, Tabellen und Minikarten. (Große Vorschau)

Alles zusammenfügen

Am Ende sollte die Dashboard-Komponentenvorlage Folgendes enthalten:

 <!-- dashboard.component.html --> <div class="grid-container"> <h1 class="mat-h1">Dashboard</h1> <mat-grid-list cols="{{ ( cardLayout | async )?.columns }}" rowHeight="200px"> <!--Mini Cards--> <mat-grid-tile *ngFor="let mc of miniCardData" [colspan]="( cardLayout | async )?.miniCard.cols" [rowspan]="( cardLayout | async )?.miniCard.rows"> <app-mini-card [icon]="mc.icon" [title]="mc.title" [value]="mc.value" [color]="mc.color" [isIncrease]="mc.isIncrease" duration="since last month" [percentValue]="mc.percentValue" [isCurrency]="mc. isCurrency"></app-mini-card> </mat-grid-tile> <!--Charts--> <mat-grid-tile [colspan]="( cardLayout | async )?.chart.cols" [rowspan]="( cardLayout | async )?.chart.rows"> <app-card title="Monthly Revenue"> <app-annual-sale-chart></app-annual-sale-chart> </app-card> </mat-grid-tile> <mat-grid-tile [colspan]="( cardLayout | async )?.chart.cols" [rowspan]="( cardLayout | async )?.chart.rows"> <app-card title="Product Sales"> <app-product-sales-chart></app-product-sales-chart> </app-card> </mat-grid-tile> <mat-grid-tile [colspan]="( cardLayout | async )?.chart.cols" [rowspan]="( cardLayout | async )?.chart.rows"> <app-card title="Sales by Traffic Source"> <app-sales-traffic-chart></app-sales-traffic-chart> </app-card> </mat-grid-tile> <mat-grid-tile [colspan]="( cardLayout | async )?.chart.cols" [rowspan]="( cardLayout | async )?.chart.rows"> <app-card title="Online Store Sessions by Traffic Source"> <app-store-sessions-chart></app-store-sessions-chart> </app-card> </mat-grid-tile> <!--Table--> <mat-grid-tile [colspan]="( cardLayout | async )?.table.cols" [rowspan]="( cardLayout | async )?.table.rows"> <app-card title="Latest Orders"> <app-orders-table></app-orders-table> </app-card> </mat-grid-tile> </mat-grid-list> </div>

Folgendes enthält das resultierende Dashboard.

fertiges Armaturenbrett
Fertiges Dashboard (große Vorschau)

Fazit

Das Erstellen von Dashboards erfordert eine Menge Arbeit und Planung. Eine Möglichkeit, sie schneller zu erstellen, besteht darin, die verschiedenen Schemata zu verwenden, die von Angular Material und ng2-charts bereitgestellt werden. Mit diesen Schemata erzeugt das Ausführen eines Befehls eine vollständig vollständige Komponente und kann dazu führen, dass ein Dashboard ziemlich schnell einsatzbereit ist. Dadurch haben Sie viel mehr Zeit, sich auf die Erstellung von Datendiensten und deren Hinzufügen zu Ihren Dashboard-Komponenten zu konzentrieren.

Wenn Sie mehr über einige der von Angular Material bereitgestellten Schemata erfahren möchten, besuchen Sie material.angular.io, und für die von ng2-charts bereitgestellten Schemata besuchen Sie deren Website, die hier verlinkt ist.