Используйте Angular Material для создания статистических таблиц.
Установите Angular Material, инструмент разработки компонентов (CDK) и библиотеку анимации Angular, а затем запустите схему кода
и добавьте схему таблицы @angular/material,
чтобы создать компонент, который может отображать предустановленный сортируемый материал Angular для. постраничные источники данных. [Рекомендация по соответствующему руководству: «Угловое руководство»]
ng сгенерируйте @angular/material:table texe1
, а затем измените ее на основе этого.
HTML-файл компонента
<div class="mat-elevation-z8"> <table mat-table class="full-width-table" matSort aria-label="Elements"> <!-- Идентификатор столбца --> <ng-контейнер matColumnDef="id"> <th mat-header-cell *matHeaderCellDef mat-sort-header>серийный номер</th> <td mat-cell *matCellDef="let row">{{row.id}}</td> </ng-контейнер> <!-- Столбец имени --> <ng-container matColumnDef="name"> <th mat-header-cell *matHeaderCellDef mat-sort-header> название породы и почвы</th> <td mat-cell *matCellDef="let row">{{row.name}}</td> </ng-контейнер> <!-- Столбец num1 --> <ng-контейнер matColumnDef="num1"> <th mat-header-cell *matHeaderCellDef mat-sort-header> ожидаемое количество</th> <td mat-cell *matCellDef="let row">{{row.num1}}</td> </ng-контейнер> <!-- Столбец num2 --> <ng-контейнер matColumnDef="num2"> <th mat-header-cell *matHeaderCellDef mat-sort-header> текущий номер</th> <td mat-cell *matCellDef="let row">{{row.num2}}</td> </ng-контейнер> <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr> <tr mat-row *matRowDef="let row; columns: displayColumns;"></tr> </таблица> <!-- Управление длиной отображения данных таблицы--> <mat-paginator #paginator [длина]="источник данных?.данные?.длина" [pageIndex]="0" [pageSize]="10" [pageSizeOptions]="[5, 10, 17]" aria-label="Выбрать страницу"> </mat-пагинатор> </div>
Файл texe1-datasource.ts компонента
import { DataSource } from '@angular/cdk/collections'; импортировать { MatPaginator } из '@angular/material/paginator'; импортировать { MatSort } из '@angular/material/sort'; импортировать {карту} из 'rxjs/operators'; импорт {Наблюдаемый, как observableOf, слияние} из 'rxjs'; // TODO: Замените это своим собственным типом модели данных интерфейс экспорта Texe1Item { имя: строка; идентификатор: номер; номер1: номер; номер2: номер; } // TODO: заменить это реальными данными из вашего приложения const EXAMPLE_DATA: Texe1Item[] = [ {id: 1, имя: «илистая глина», num1:1000, num2:100,}, {id: 2, name: 'илистая илистые глина', num1:1000, num2:100,}, {id: 3, имя: 'Глина', num1:1000, num2:100,}, {id: 4, название: 'Глинистый ил', num1:1000, num2:100,}, {id: 5, имя: 'илистая глина', num1:1000, num2:100,}, {id: 6, name: 'Брекчия (брекчия)', num1:1000, num2:100,}, {id: 7, имя: '中沙', num1:1000, num2:1000,}, {id: 8, name: «Органическая почва», num1:1000, num2:100,}, {id: 9, name: 'Торфяная почва А', num1:1000, num2:100,}, {id: 10, имя: 'Торфяная почва Б', num1:1000, num2:100,}, {id: 11, имя: 'Песчаный ил', num1:1000, num2:100,}, {id: 12, имя: 'иловый песок', num1:1000, num2:100,}, {id: 13, имя: 'мелкий песок', num1:1000, num2:100,}, {id: 14, имя: 'крупный песок', num1:1000, num2:100,}, {id: 15, имя: «Гравий», num1:1000, num2:100,}, {id: 16, name: 'Галька (гравий)', num1:1000, num2:100,}, {id: 17, имя: 'Боулдер (валун)', num1:1000, num2:100,}, ]; /** * Источник данных для представления Texe1. Этот класс должен. * инкапсулировать всю логику для получения и управления отображаемыми данными * (включая сортировку, нумерацию страниц и фильтрацию). */ класс экспорта Texe1DataSource расширяет DataSource<Texe1Item> { данные: Texe1Item[] = EXAMPLE_DATA; разбиение на страницы: MatPaginator | не определено; сортировка: МатСорт | не определено; конструктор() { супер(); } /** * Подключите этот источник данных к таблице. Таблица будет обновляться только тогда, когда. * возвращенный поток выдает новые элементы. * @returns Поток элементов, которые необходимо отобразить. */ Connect(): Observable<Texe1Item[]> { if (this.paginator && this.sort) { // Объединяем все, что влияет на отображаемые данные, в одно обновление // поток для таблицы данных для использования. return merge(observableOf(this.data), this.paginator.page, this.sort.sortChange) .pipe(map(() => { return this.getPagedData(this.getSortedData([...this.data])); })); } еще { throw Error('Пожалуйста, установите разбивку на страницы и отсортируйте источник данных перед подключением.'); } } /** * Вызывается при уничтожении таблицы. Используйте эту функцию для очистки. * любые открытые соединения или освобождение любых удерживаемых ресурсов, которые были настроены во время подключения. */ отключить(): пустота {} /** * Разбивка данных на страницы (на стороне клиента). Если вы используете разбиение на страницы, * это будет заменено запросом соответствующих данных с сервера. */ частный getPagedData (данные: Texe1Item []): Texe1Item [] { если (this.paginator) { const startIndex = this.paginator.pageIndex * this.paginator.pageSize; вернуть data.splice(startIndex, this.paginator.pageSize); } еще { возврат данных; } } /** * Сортировка данных (на стороне клиента). Если вы используете сортировку на стороне сервера, * это будет заменено запросом соответствующих данных с сервера. */ частный getSortedData (данные: Texe1Item []): Texe1Item [] { if (!this.sort || !this.sort.active || this.sort.direction === '') { возврат данных; } return data.sort((a, b) => { const isAsc = this.sort?.direction === 'asc'; переключатель (this.sort?.active) { случай 'имя': return Compare(a.name, b.name, isAsc); случай 'id': return Compare(+a.id, +b.id, isAsc); по умолчанию: вернуть 0; } }); } } /** Простой компаратор сортировки, например столбцы ID/Name (для сортировки на стороне клиента */). функция сравнения (a: строка | число, b: строка | число, isAsc: логическое значение): число { return (a <b?-1:1) * (isAsc?1:-1); }
Файл texe1.comComponent.ts компонента
import { AfterViewInit, Component, ViewChild } from '@angular/core'; импортировать { MatPaginator } из '@angular/material/paginator'; импортировать { MatSort } из '@angular/material/sort'; импортировать { MatTable } из '@angular/material/table'; импортировать { Texe1DataSource, Texe1Item } из './texe1-datasource'; @Компонент({ селектор: 'app-texe1', templateUrl: './texe1.comComponent.html', styleUrls: ['./texe1.comComponent.css'] }) класс экспорта Texe1Component реализует AfterViewInit { @ViewChild(MatPaginator) пагинатор!: MatPaginator; @ViewChild(MatSort) сортировка!: MatSort; Таблица @ViewChild(MatTable)!: MatTable<Texe1Item>; источник данных: Texe1DataSource; /** Идентификаторы столбцов, отображаемые в таблице, можно добавлять, удалять или переупорядочивать */. displayColumns = ['id', 'name','num1','num2']; конструктор() { this.dataSource = новый Texe1DataSource(); } ngAfterViewInit(): void { this.dataSource.sort = this.sort; this.dataSource.paginator = this.paginator; this.table.dataSource = this.dataSource; } }
Наконец, он отображается в файле app.comComponent.html.
<app-texe1></app-texe1>
Рендеринг: