angular - MatTablen laajenna/supista kuvakeongelma sivutuksessa ja lajittelussa


Minulla on Angular Material -taulukko, joka käyttää detailRow-direktiiviä lisätäkseen yksityiskohtaisen/vierekkäisen rivin taulukkoriville.

StackBlitz

Halusin antaa sille vaikutelman ikään kuin riviä laajennettaisiin tai supistettaisiin, joten lisäsin siihen pari kuvaketta, joita vaihdetaan napsautettaessa solua, joka sisältää ne.

<mat-header-cell *matHeaderCellDef> Action </mat-header-cell>
      <mat-cell *matCellDef="let element"> 
         <button mat-icon-button color="primary"  (click)="element[i] = !element[i]">
            <mat-icon id="expand_more"  #expand_more *ngIf="!element[i] "  >expand_more</mat-icon>
            <mat-icon id="expand_less"  #expand_less *ngIf="element[i] ">expand_less</mat-icon>
          </button> 
      </mat-cell>

Kuitenkin jos jätän rivin laajennetuksi ja sivutan tai teen lajittelun, kuvakkeet eivät vaihdu, koska niitä ei voi vaihtaa.

Olen yrittänyt kytkeytyä page-tapahtumaan tai sortChange-tapahtumaan, mutta en saanut mitään aikaan.

Tiedän, että Angular Material v7:ssä on uusi tapa tehdä laajennus/pienennys, joka todennäköisesti toimii hyvin sivutuksen ja lajittelun kanssa, mutta päivitykseen menee vielä hetki. Sillä välin onko kenelläkään ideoita, miten tämä voisi ratkaista.

Vastaus #1

Lyhyt vastaus

Lisää tämä tiedostoon cdk-detail-row.directive.ts

  ngOnDestroy(): void {
    this.row[undefined] = false;
  }

Pitkä vastaus

Ensinnäkin, napsautuksen käsitellään kahdessa paikassa, kerran mat-rivissä ja toisessa mat-solussa (ikonin napsauttaminen laukaisee molemmat tapahtumat. Napsauttamalla rivin muissa kohdissa laukaistaan vain onToggleChange). Ja myös tämä element[i]=!element[i] on temppu - (muuttuja i on määrittelemätön). Joten jos napsautat rivin muissa kohdissa, laajennusikoni ei muutu; tästä syystä olin hämmentynyt, koska luulin, että sen ei pitäisi muuttua. Esimerkki poistaa vain napsautuksen mat-solusta yksinkertaistamiseksi.

Tiedostossa table-basic-example.html sinun tulisi poistaa siitä (click) -tulos ja lisätä rivin argumentti menetelmään onToggleChange($event, row). Ja muuta *ng-if kuuntelemaan element.close-signaalia sen sijaan

<ng-container matColumnDef="expandCollapse">
  <mat-header-cell *matHeaderCellDef> Action </mat-header-cell>
  <mat-cell *matCellDef="let element"> 
     <button mat-icon-button color="primary">
        <mat-icon id="expand_more"  #expand_more *ngIf="!element.close"  >expand_more</mat-icon>
        <mat-icon id="expand_less"  #expand_less *ngIf="element.close">expand_less</mat-icon>
      </button> 
  </mat-cell>
</ng-container>

<mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
<mat-row *matRowDef="let row; columns: displayedColumns;"
        class="element-row"
        [cdkDetailRow]="row" [cdkDetailRowTpl]="tpl"
        (toggleChange)="onToggleChange($event, row)">
</mat-row>

taulukko-perusesimerkki.ts

Lisää sulje-ominaisuus käyttöliittymäelementtiin

export interface Element {
    name: string;
    position: number;
    weight: number;
    symbol: string;
    close?: boolean;
}

Nyt käsittelemme rivin sulkemisen ja avaamisen onToggleChange-metodissa.

onToggleChange(cdkDetailRow: CdkDetailRowDirective, row: Element): void {
    if (this.singleChildRowDetail && this.openedRow && this.openedRow.expended) {
        this.openedRow.toggle();
    }
    if (!row.close) {
        row.close = true;
    } else {
        row.close = false;
    }
    this.openedRow = cdkDetailRow.expended ? cdkDetailRow : undefined;
}

Viimeiseksi, tiedostossa cdk-detail-row.directive.ts haluamme sulkea rivin, kun direktiivi poistetaan käytöstä sivutuksen tai vaihtamisen seurauksena. Joten toteutamme onDestroy-menetelmän

export class CdkDetailRowDirective implements OnDestroy{
     ...Details of implementation.....
}

Uuden ngOnDestroy-metodin pitäisi näyttää tältä

ngOnDestroy(): void {
  this.row.close = false;
}

Aiheeseen liittyviä artikkeleita