簡體   English   中英

在angular 7中動態html引導程序表中實現排序和過濾的最佳方法是什么?

[英]What is the best way to implement sorting and filtering in a dynamic html bootstrap table in angular 7?

我想在角度為7的表格中實現排序和過濾。使用一些可用的解決方案(如角度材料)或構建簡單的排序和過濾管道是一個好主意。

我發現自己處於這種情況,我已經使用了有角度的材料,所以我選擇繼續使用它。

這就是我處理搜索和表格排序的方式

我創建了一個類來處理http數據的數據類,我在其中調用了發出http數據請求的服務

import {Domanda} from '../models';
import {DataSource} from '@angular/cdk/table';
import {BehaviorSubject, Observable, of} from 'rxjs';
import {catchError, finalize} from 'rxjs/operators';
import {CollectionViewer} from '@angular/cdk/collections';
import {ApiService} from './api.service';


export class ListaDomandeDatasource implements DataSource<Domanda> {

  private domandeSubject = new BehaviorSubject<Domanda[]>([]);


// Gestisce il caricamento della tabella
  private loadingSubject = new BehaviorSubject<boolean>(false);

  public loading$ = this.loadingSubject.asObservable();

  constructor(private apiService: ApiService) {

  }

  cercaDomande(idConcorso: number,
               keywords: string,
               sortOrder: string,
               pageIndex: number,
               pageSize: number) {

    this.loadingSubject.next(true);

    this.apiService.cercaDomande(idConcorso, keywords, sortOrder,
      pageIndex, pageSize).pipe(
      catchError(() => of([])),
      finalize(() => this.loadingSubject.next(false))
    )
      .subscribe(lessons => this.domandeSubject.next(lessons));

  }

  connect(collectionViewer: CollectionViewer): Observable<Domanda[]> {
    console.log('Connecting data source');
    return this.domandeSubject.asObservable();
  }

  disconnect(collectionViewer: CollectionViewer): void {
    this.domandeSubject.complete();
    this.loadingSubject.complete();
  }

}

在定義表的組件中,我只需使用rxjs來監聽輸入,但實際上邏輯部分都是由后端完成的。

import {AfterViewInit, Component, ElementRef, OnInit, ViewChild} from '@angular/core';
import {Concorso} from '../../../../core/models';
import {MatPaginator, MatSort} from '@angular/material';
import {ActivatedRoute, Router} from '@angular/router';
import {ApiService} from '../../../../core/services';
import {ListaDomandeDatasource} from '../../../../core/services/lista-domande.datasource';
import {fromEvent, merge} from 'rxjs';
import {debounceTime, distinctUntilChanged, tap} from 'rxjs/operators';

@Component({
  selector: 'app-lista-domande',
  templateUrl: './concorso.component.html',
  styleUrls: ['./concorso.component.scss']
})
export class ConcorsoComponent implements OnInit, AfterViewInit {
  nomeColonne: string[] = ['id', 'nominativo', 'dataNascita', 'dataProva', 'nomeProva', 'open'];

  dataSource: ListaDomandeDatasource;
  concorso: Concorso; // Risultato del resolver esistenza concorso


  @ViewChild(MatPaginator, { static: true }) paginator: MatPaginator;
  @ViewChild(MatSort, { static: true }) sort: MatSort;
  @ViewChild('input', { static: true }) input: ElementRef;

  constructor(private api: ApiService,
              private router: Router,
              private route: ActivatedRoute) {

  }


  ngOnInit() {

    /* Se si resta sulla stessa pagina e si cambiano solo i parametri la pagina non viene ricaricata, dunque ngOnInit non viene triggerato,
    * per ovviare a ciò resto in ascolto dei parametri che cambiano e chiamo la lista delle domande */
    this.route.params.subscribe(
      () => {
        this.concorso = this.route.snapshot.data.concorso;
      }
    );

    // Istanzio il datasource passandogli il service
    this.dataSource = new ListaDomandeDatasource(this.api);

    this.dataSource.cercaDomande(this.concorso.id, '', 'asc', 0, 3);

  }

  ngAfterViewInit() {

    this.sort.sortChange.subscribe(() => this.paginator.pageIndex = 0);

    // Triggero evento input nella searchbar
    fromEvent(this.input.nativeElement, 'keyup')
      .pipe(
        debounceTime(150),
        distinctUntilChanged(),
        tap(() => {
          this.paginator.pageIndex = 0;

          this.CaricaPaginaDomande();
        })
      )
      .subscribe();

    merge(this.sort.sortChange, this.paginator.page)
      .pipe(
        tap(() => this.CaricaPaginaDomande())
      )
      .subscribe();

  }

  CaricaPaginaDomande() {
    this.dataSource.cercaDomande(
      this.concorso.id,
      this.input.nativeElement.value,
      this.sort.direction,
      this.paginator.pageIndex,
      this.paginator.pageSize);
  }

  GotoDomanda(id) {
    return 'domanda/' + id;
  }

}

這是html部分:

<h2>CONCORSO: {{concorso.id}}</h2>

<div fxLayout="column">


  <mat-form-field>
    <label for="searchbar"></label>
    <input matInput id="searchbar" placeholder="Cerca candidato per il suo identificativo" #input>
    <mat-icon matPrefix>search</mat-icon>
  </mat-form-field>


  <div class="spinner-container" *ngIf="dataSource.loading$ | async">
    <mat-spinner></mat-spinner>
  </div>

  <table fxFill
         mat-table [dataSource]="dataSource"
         matSort matSortActive="created" matSortDisableClear matSortDirection="asc">

    <!-- Colonna id domande-->
    <ng-container matColumnDef="id">
      <th mat-header-cell *matHeaderCellDef>#</th>
      <td mat-cell *matCellDef="let row">{{row.DomandaConcorso.IdDomanda}}</td>
    </ng-container>

    <!-- Colonna cognome nome canditato -->
    <ng-container matColumnDef="nominativo">
      <th mat-header-cell *matHeaderCellDef>Nominativo</th>
      <td mat-cell *matCellDef="let row">{{row.Anagrafica.Cognome}} {{row.Anagrafica.Nome}}</td>
    </ng-container>

    <!-- Colonna data di nascita candidato -->
    <ng-container matColumnDef="dataNascita">
      <th mat-header-cell *matHeaderCellDef>Data di nascita</th>
      <td mat-cell *matCellDef="let row">{{row.Anagrafica.DataNascita}}</td>
    </ng-container>

    <!-- Colonna data prova candidato -->
    <ng-container matColumnDef="dataProva">
      <th mat-header-cell *matHeaderCellDef>Data prova</th>
      <td mat-cell *matCellDef="let row">{{row.prove[2].dataProva}}</td>
    </ng-container>

    <!-- Colonna nome ultima prova -->
    <ng-container matColumnDef="nomeProva">
      <th mat-header-cell *matHeaderCellDef>Data prova</th>
      <td mat-cell *matCellDef="let row">{{row.prove[2].nomeProva}}</td>
    </ng-container>


    <!-- Colonna bottone apri singola domande -->
    <ng-container matColumnDef="open">
      <th mat-header-cell *matHeaderCellDef></th>
      <td mat-cell *matCellDef="let row" >
        <button [routerLink]="GotoDomanda(row.DomandaConcorso.IdDomanda)"  mat-flat-button>VISUALIZZA</button>
      </td>
    </ng-container>


    <tr mat-header-row *matHeaderRowDef="nomeColonne"></tr>
    <tr mat-row *matRowDef="let row; columns: nomeColonne;"></tr>
  </table>

  <mat-paginator [length]="20" [pageSize]="3"
                 [pageSizeOptions]="[3, 5, 10]"></mat-paginator>

</div>

如果沒有閱讀數據表的文檔,就無法做到這一點: https//material.angular.io/components/categories/tables

如果您有任何其他問題告訴我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM