Создание угловой динамической таблицы с фильтром и нумерацией страниц: подробное руководство

В этой статье мы рассмотрим различные методы реализации динамической таблицы с функциями фильтрации и разбиения на страницы в Angular. Мы рассмотрим несколько подходов с примерами кода, чтобы помочь вам понять концепции и выбрать тот, который лучше всего соответствует вашим требованиям. К концу вы получите четкое представление о том, как создать эффективный и удобный табличный компонент в приложениях Angular.

Содержание:

  1. Метод 1: использование компонента таблицы угловых материалов
  2. Метод 2: реализация пользовательского фильтра и логики разбиения на страницы
  3. Метод 3. Использование внешних библиотек для расширенных функций
  4. Метод 4: разбиение на страницы и фильтрация на стороне сервера

Метод 1: использование компонента таблицы Angular Material:
Angular Material предоставляет мощный компонент таблицы, который поддерживает сортировку, фильтрацию и нумерацию страниц прямо из коробки. Вот пример того, как его использовать:

<!-- app.component.html -->
<ng-container *ngIf="dataSource">
  <mat-table [dataSource]="dataSource" matSort matSortActive="columnToSort" matSortDirection="asc">
    <!-- Define your table columns here -->
    <mat-header-row *matHeaderRowDef="tableColumns"></mat-header-row>
    <mat-row *matRowDef="let row; columns: tableColumns"></mat-row>
  </mat-table>
  <mat-paginator [pageSizeOptions]="[5, 10, 25]" showFirstLastButtons></mat-paginator>
</ng-container>
// app.component.ts
import { Component, OnInit, ViewChild } from '@angular/core';
import { MatPaginator } from '@angular/material/paginator';
import { MatSort } from '@angular/material/sort';
import { MatTableDataSource } from '@angular/material/table';
@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
  dataSource: MatTableDataSource<any>;
  tableColumns: string[] = ['column1', 'column2', 'column3'];
  @ViewChild(MatPaginator) paginator: MatPaginator;
  @ViewChild(MatSort) sort: MatSort;
  ngOnInit() {
    // Initialize your data source
    this.dataSource = new MatTableDataSource(yourDataArray);
    this.dataSource.paginator = this.paginator;
    this.dataSource.sort = this.sort;
  }
}

Метод 2: реализация пользовательского фильтра и логики разбиения на страницы.
Если вам требуется дополнительная настройка или у вас есть особые требования, вы можете реализовать собственный фильтр и логику разбиения на страницы. Вот пример:

<!-- app.component.html -->
<input type="text" [(ngModel)]="filterValue" (input)="applyFilter()" placeholder="Filter">
<ng-container *ngIf="filteredData">
  <table>
    <!-- Define your table headers here -->
    <thead>
      <tr>
        <th>Column 1</th>
        <th>Column 2</th>
        <th>Column 3</th>
      </tr>
    </thead>
    <tbody>
      <tr *ngFor="let item of filteredData | paginate: { itemsPerPage: pageSize, currentPage: currentPage, totalItems: totalItems }">
        <!-- Display your table data here -->
        <td>{{ item.column1 }}</td>
        <td>{{ item.column2 }}</td>
        <td>{{ item.column3 }}</td>
      </tr>
    </tbody>
  </table>
  <pagination-controls (pageChange)="currentPage = $event"></pagination-controls>
</ng-container>
// app.component.ts
import { Component } from '@angular/core';
import { DataService } from './data.service';
@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  filteredData: any[];
  filterValue: string;
  pageSize = 10;
  currentPage = 1;
  totalItems: number;
  constructor(private dataService: DataService) {}
  ngOnInit() {
    this.getData();
  }
  getData() {
    // Fetch your data from a service or API
    this.dataService.getData().subscribe((data) => {
      this.filteredData = data;
      this.totalItems = data.length;
    });
  }
  applyFilter() {
    // Apply filtering logic based on filterValue
    // Update filteredData and totalItems accordingly
  }
}

Метод 3. Использование внешних библиотек для расширенных функций.
Существует несколько внешних библиотек, которые предоставляют расширенные функции для динамических таблиц в Angular. Некоторые популярные варианты включают ngx-datatable, ag-Grid и PrimeNG. Вы можете изучить их документацию и примеры, чтобы использовать их возможности в своем приложении.

Метод 4. Разбиение на страницы и фильтрация на стороне сервера.
В сценариях, где у вас большой набор данных, зачастую более эффективно реализовать разбиение на страницы и фильтрацию на стороне сервера. Вот общий пример того, как это сделать:

<!-- app.component.html -->
<input type="text" [(ngModel)]="filterValue" (input)="applyFilter()" placeholder="Filter">
<ng-container *ngIf="filteredData">
  <table>
    <!-- Define your table headers here -->
    <thead>
      <tr>
        <th>Column 1</th>
        <th>Column 2</th>
        <th>Column 3</th>
      </tr>
    </thead>
    <tbody>
      <tr *ngFor="let item of filteredData">
        <!-- Display your table data here -->
        <td>{{ item.column1 }}</td>
        <td>{{ item.column2 }}</td>
        <td>{{ item.column3 }}</td>
      </tr>
    </tbody>
  </table>
  <pagination-controls (pageChange)="currentPage = $event"></pagination-controls>
</ng-container>
// app.component.ts
import { Component } from '@angular/core';
import { DataService } from './data.service';
@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  filteredData: any[];
  filterValue: string;
  pageSize = 10;
  currentPage = 1;
  totalItems: number;
  constructor(private dataService: DataService) {}
  ngOnInit() {
    this.getData();
  }
  getData() {
    // Fetch your data from a service or API with server-side pagination and filtering
    this.dataService.getData(this.filterValue, this.currentPage, this.pageSize).subscribe((data) => {
      this.filteredData = data.items;
      this.totalItems = data.totalItems;
    });
  }
  applyFilter() {
    // Reset the current page to 1 and fetch the data again
    this.currentPage = 1;
    this.getData();
  }
}

В этом методе вы отправляете параметры фильтра и разбиения на страницы в серверный API и получаете отфильтрованные и разбитые на страницы данные. В примере предполагается наличие DataService, который обрабатывает связь API.

В этой статье мы рассмотрели несколько методов реализации динамической таблицы с фильтром и нумерацией страниц в Angular. Мы рассмотрели использование табличного компонента Angular Material, реализацию пользовательской логики фильтрации и разбиения на страницы, использование внешних библиотек, а также разбиение на страницы и фильтрацию на стороне сервера. Понимая эти методы и примеры их кода, вы можете улучшить взаимодействие с пользователем и производительность своих приложений Angular.

Не забудьте адаптировать примеры кода в соответствии с вашими конкретными потребностями и структурой приложения. Поэкспериментируйте с разными подходами и выберите тот, который лучше всего соответствует вашим требованиям. Приятного кодирования!