简体   繁体   English

Angular 8:如何在行单击时切换多行并在单击 Angular Material Table 的单个按钮上展开所有行?

[英]Angular 8: How to toggle multiple rows on row click and to expand all rows on a single button click on Angular Material Table?

I am working on the Angular Material Table and get the data source dynamically.我正在处理 Angular Material Table 并动态获取数据源。 I want to toggle multiple rows on a row click with expand all rows on a button click outside the table.我想在一行单击时切换多行,并在表外单击按钮时展开所有行。

I can expand a one row at a time on row click but i want to toggle multiple rows.我可以在行单击时一次展开一行,但我想切换多行。 How can i do that?我怎样才能做到这一点?

Here is the html这是html

 <input class="input-form-submit" type="button" value="SHOW ALL DETAIL" (click)="showAllDetail()"> <table mat-table [dataSource]="dataSource" matSort multiTemplateDataRows class="mat-elevation-z8 material-table"> <ng-container matColumnDef="postedBy"> <th mat-header-cell *matHeaderCellDef mat-sort-header>By</th> <td mat-cell *matCellDef="let element">{{element.first_name}}</td> </ng-container> <ng-container matColumnDef="postDate"> <th mat-header-cell *matHeaderCellDef mat-sort-header>Date</th> <td mat-cell *matCellDef="let element">{{element.date | date: 'M/d/yyyy h:mm a'}} </td> </ng-container> <ng-container matColumnDef="balance"> <th mat-header-cell *matHeaderCellDef mat-sort-header>Balance</th> <td mat-cell *matCellDef="let element"> ${{element.balance}}</td> </ng-container> <ng-container matColumnDef="collected"> <th mat-header-cell *matHeaderCellDef mat-sort-header>Collected</th> <td mat-cell *matCellDef="let element"> (${{element.amountReceived | number : '1.2-2'}}) </ng-container> <ng-container matColumnDef="adjusted"> <th mat-header-cell *matHeaderCellDef mat-sort-header>Adjusted</th> <td mat-cell *matCellDef="let element"> ${{element.adjusted | number : '1.2-2'}} </ng-container> <ng-container matColumnDef="expandedDetail"> <td mat-cell *matCellDef="let element; let i = index" [attr.colspan]="displayedColumns2.length"> <ng-container *ngIf="showDetailTransaction || (selectedRow == element && i)"> <div class="trans-div"> <table class="dt-width transaction-expansion" [@detailExpand]="checkExpanded(element) ? 'expanded' : 'collapsed'"> <ng-container> <tr> <td>DATA TO EXPAND</td> </tr> </ng-container> </table> </div> </ng-container> </td> </ng-container> <tr mat-header-row *matHeaderRowDef="displayedColumns2"></tr> <tr mat-row *matRowDef="let element; columns: displayedColumns2;" class="transaction-exp-row" [class.transaction-expand-row]="checkExpanded(element)" (click)="onExpandOneRow(element)"></tr> <tr mat-row *matRowDef="let row; columns: ['expandedDetail']" class="transaction-detail-row" style="height: 0px !important;"></tr> </table>

Here is the ts code这是ts代码

 showAllDetail() { this.showDetailTransaction = true; } checkExpanded(element): boolean { let flag = false; this.expandedElement.forEach(e => { if (e === element) { flag = true; } }); return flag; } onExpandOneRow(element) { const index = this.expandedElement.indexOf(element); if (index === -1) { this.expandedElement.push(element); } else { this.expandedElement.splice(index, 1); } this.selectedRow = element; this.showHideRow = !this.showHideRow; }

For me, the best solution is add a new propertie to dataSource "expanded"对我来说,最好的解决方案是向数据源“扩展”添加一个新属性

export interface PeriodicElement {
  ...
  expanded?: boolean;
}

Then, when click in tr we change this value然后,当点击 tr 我们改变这个值

  <tr mat-row *matRowDef="let element; columns: columnsToDisplay;"
      class="example-element-row"
      [class.example-expanded-row]="element.expanded"
      (click)="element.expanded = !element.expanded">
  </tr>

At last you say when is expanded as最后你说 when 扩展为

<div class="example-element-detail"
           [@detailExpand]="element.expanded ? 'expanded' : 'collapsed'">

For show all you make a function that put the variable expanded of the datasource to true -or false if all are true为了显示所有内容,您创建了一个函数,该函数将数据源的扩展变量设置为 true - 如果全部为 true,则为 false

showAll() {
    if (this.dataSource.some(x => !x.expanded))
      this.dataSource.forEach(x => (x.expanded = true));
    else 
      this.dataSource.forEach(x => (x.expanded = false));
  }

See the stackblitz查看堆栈闪电战

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM