You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular Material表格可展开行拖拽排序功能实现求助

Angular Material表格可展开行拖拽排序功能实现求助

大家好,我目前在开发Angular Material可展开表格时,遇到了拖拽排序的问题,想请各位帮忙排查一下问题所在。

我的需求是:让表格中可展开的行能够互相拖拽,调整它们的排序位置。我已经尝试在展开行的HTML元素上添加了Angular CDK DragDrop的相关属性(cdkDrag、cdkDragLockAxis="y"、[cdkDragData]="row"),现在虽然能拖动展开行,但松开鼠标后,行并不会像普通拖拽排序那样自动调整上下位置,就只是停在拖动后的位置,完全没有触发数据层面的排序更新——相当于拖拽只是“视觉上的移动”,实际数据和行的顺序都没变化。

我实在搞不清楚代码里漏掉了什么关键配置,希望有经验的朋友能帮我梳理一下,要是有其他替代的实现方案也非常欢迎。

下面是我写的和展开行相关的HTML代码:

<!-- Expanded Content Column - The detail row is made up of this one column that spans across all columns -->
<ng-container matColumnDef="expandedDetail">
  <td mat-cell *matCellDef="let element" [attr.colspan]="columnsToDisplayWithExpand.length" >
    <div class="example-element-detail" [@detailExpand]="isElementExpanded(element) ? 'expanded' : 'collapsed'" >
      <div></div>
      <!-- <div class="example-element-diagram">
        <div class="example-element-position">{{element.position}}</div>
        <div class="example-element-symbol">{{element.symbol}}</div>
        <div class="example-element-name">{{element.name}}</div>
        <div class="example-element-weight">{{element.weight}}</div>
      </div>
      <div class="example-element-description">
        {{element.description}}
        <span class="example-element-description-attribution"> -- Wikipedia </span>
      </div> -->
      <div class="example-element-name expanded-column-spacing">
        {{element.Name}}
      </div>
      <div class="example-element-weight expanded-column-spacing">
        {{element.weight}}
      </div>
      <div class="example-element-weight expanded-column-spacing">
        {{element.weight}}
      </div>
    </div>
  </td>
</ng-container>

<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
<tr mat-row *matRowDef="let element; columns: displayedColumns;" class="example-element-row" [class.example-expanded-row]="isElementExpanded(element)" ></tr>
<tr mat-row *matRowDef="let row; columns: ['expandedDetail']" (click)="toggle(row)" cdkDrag cdkDragLockAxis="y" [cdkDragData]="row" ></tr>
<tr mat-row *matRowDef="let row; columns: ['expandedDetail']" class="example-detail-row" ></tr>
<tr mat-row *matRowDef="let row; columns: ['expandedDetail']" class="example-detail-row" ></tr>
<tr mat-row *matRowDef="let row; columns: ['expandedDetail']" class="example-detail-row" ></tr>
</tr>
<tr mat-row *matRowDef="let row; columns: getDisplayedColumns()"></tr>
</table>

相关的TypeScript和CSS代码我也整理在了示例项目中,核心逻辑都围绕上面的HTML展开。

非常感谢大家的帮助!

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 07:09:34