As Andrew Segin mentioned here , this is already doable out of the box: using a predicate when.
: https://stackblitz.com/edit/angular-material-expandable-table-rows ( )

mat-table mat-row matRipple. expandedElement :
<mat-row *matRowDef="let row; columns: displayedColumns;"
matRipple
class="element-row"
[class.expanded]="expandedElement == row"
(click)="expandedElement = row">
</mat-row>
, , :
<mat-row *matRowDef="let row; columns: ['expandedDetail']; when: isExpansionDetailRow"
[@detailExpand]="row.element == expandedElement ? 'expanded' : 'collapsed'"
style="overflow: hidden">
</mat-row>
when . isExpansionDetailRow , , detailRow detailRow:
isExpansionDetailRow = (row: any) => row.hasOwnProperty('detailRow');
RC0 :
isExpansionDetailRow = (i: number, row: any) => row.hasOwnProperty('detailRow');
, "ExpansionDetailRow", detailRow , :
connect(): Observable<Element[]> {
const rows = [];
data.forEach(element => rows.push(element, { detailRow: true, element }));
return Observable.of(rows);
}
rows row , :

: DIRECTIVE
Mat (, )