Angular Material - MatTable 可扩展行动画

Lpp*_*Edd 2 angular-material angular

目前我已经建立了一个MatTable可扩展的行:

<!-- Hidden cell -->
<ng-container matColumnDef="expandedDetail">
    <td mat-cell *matCellDef="let myModel" [attr.colspan]="displayedColumns.length">
        <div
            class="detail-cell"
            [@detailExpand]="myModel.isExpanded ? 'expanded' : 'collapsed'"
        >
            <my-inner-component
                ...
            ></my-inner-component>
        </div>
    </td>
</ng-container>
Run Code Online (Sandbox Code Playgroud)

和行:

<!-- Hidden row -->
<tr
    mat-row
    *matRowDef="let myModel; columns: ['expandedDetail']"
></tr>
Run Code Online (Sandbox Code Playgroud)

可扩展行附加了动画:

animations: [
    trigger('detailExpand', [
        state('collapsed, void', style({ height: '0px', minHeight: '0', display: 'none' })),
        state('expanded', style({ height: '*' })),
        transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)'))
    ])
]
Run Code Online (Sandbox Code Playgroud)

由于我显示了很多行,这my-inner-component是一个沉重的组成部分,我希望仅在行展开时才创建它。
所以我补充说:

*ngIf="myModel.isExpanded"
Run Code Online (Sandbox Code Playgroud)

到包含div.

然而,动画显然中断了。
我怎么解决这个问题?如果可能的话,我想保持动画。

ben*_*oam 5

使用entry/leave过渡:

ts 文件中的动画:

animations: [
  trigger(
    'detailExpand', [
      transition(':enter', [
        style({ height: '0px', minHeight: '0', display: 'none' }),
        animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)', style({ height: '*' }))
      ]),
      transition(':leave', [
        style({ height: '*' }),
        animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)', style({ height: '0px', minHeight: '0', display: 'none' }))
      ])
    ]
  )
]
Run Code Online (Sandbox Code Playgroud)

在模板中使用它:

<my-inner-component *ngIf="myModel.isExpanded" [@detailExpand]>
  ...
</my-inner-component>
Run Code Online (Sandbox Code Playgroud)

  • 关闭动画不起作用。它立即关闭,因为“我的内部组件”不再存在 (2认同)